2016-08-15 6 views
7

私はサーフィンしていて、記事Preventing CSRF with the same-site cookie attributeを見つけました。同じサイトクッキー属性を持つCSRFの防止

リンク維持時Set-Cookieヘッダーを追加する必要があります。

Set-Cookie:key = value; HttpOnly; 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-CookieSameSite =厳格なを追加します。そのため、我々は同じ愚かなWEBAPIクッキーのバグを修正するためにowin使用し、この日および年齢で

+0

https://twitter.com/blowdart/status/918140614167879680 それが入ってきます.net sooooon –

+0

これはコードで実行できます。チェックアウトhttps://stackoverflow.com/a/48829569/4079967 –

2

...

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

することができます

0:

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

Response.SetCookie(httpCookie); 

これはあなたに次のヘッダーを与える:クッキーを作成する際にも、コードでこれを設定します

フレームワークにプッシュされるまでのハックのビット。

関連する問題