2016-08-15 43 views
7

我在瀏覽網頁並找到文章Preventing CSRF with the same-site cookie attribute使用同一網站Cookie屬性防止CSRF

至於鏈接維護我們需要添加Set-Cookie頭。

Set-Cookie:key = value;僅Http; SameSite = strict

現在我的問題是,我想在我的ASP.NET網站中設置所有Cookie和身份驗證Cookie。 我試圖用IIS頭來設置這個,但有人說這是錯誤的實現方式。

我也在下面試過。

HttpCookie newAuthenticationCookie = new HttpCookie(FormsAuthentication.FormsCookieName 
        , FormsAuthentication.Encrypt(newAuthenticationTicket)) 
       { 
        HttpOnly = true 
       }; 
newAuthenticationCookie.Values.Add("SameSite", "strict"); 

但它似乎沒有幫助我。

請給我一個更好的方法來做到這一點。

謝謝。

回答

12

經過對HttpCookie Source的深入審查,確認我們無法在代碼中執行此操作,因爲無法在Cookie上添加額外屬性,並將類標記爲密封。

但無論如何,我管理解決方案通過修改web.config如下。

<rewrite> 
    <outboundRules> 
    <rule name="Add SameSite" preCondition="No SameSite"> 
     <match serverVariable="RESPONSE_Set_Cookie" pattern=".*" negate="false" /> 
     <action type="Rewrite" value="{R:0}; SameSite=strict" /> 
     <conditions> 
     </conditions> 
    </rule> 
    <preConditions> 
     <preCondition name="No SameSite"> 
     <add input="{RESPONSE_Set_Cookie}" pattern="." /> 
     <add input="{RESPONSE_Set_Cookie}" pattern="; SameSite=strict" negate="true" /> 
     </preCondition> 
    </preConditions> 
    </outboundRules> 
</rewrite> 

這對每個的Set-Cookie添加SameSite =嚴格

+0

https://twitter.com/blowdart/status/918140614167879680 它進來.net sooooon –

+0

你可以在代碼中做到這一點,結帳https://stackoverflow.com/a/48829569/4079967 –

2

因爲在這個時代,我們使用owin解決同愚蠢的WebAPI的cookie漏洞...

public class CookieSameSiteMiddleware : OwinMiddleware 
{ 
    public CookieSameSiteMiddleware(OwinMiddleware next) : base(next) 
    { 
    } 

    public override async Task Invoke(IOwinContext context) 
    { 
     var url = context.Request.Path.Value.ToLowerInvariant(); 

     if (url.Contains("/api/mylogin")) 
     { 
      context.Response.OnSendingHeaders(x => 
      { 
       var scv = context.Response.Headers.FirstOrDefault(h => h.Key == "Set-Cookie"); 
       if (!scv.Equals(default(KeyValuePair<string, string[]>))) 
       { 
        //context.Response.Headers.Remove("Set-Cookie"); 
        context.Response.Headers.Set("Set-Cookie", scv.Value[0] + "; SameSite=strict"); 
       } 

      }, null); 
     } 

     await this.Next.Invoke(context); 
    } 
} 

確保中間件是.UseWebApi()之前註冊

0

你可以

var httpCookie = new HttpCookie("mycookie", "myvalue"); 
httpCookie.Path += ";SameSite=Strict"; 

Response.SetCookie(httpCookie); 

這會給你下面的頭:

0創建cookie時也設置該代碼

一點點黑客,直到它被推入框架。