私はウェブをサーフィンしていて、記事 同じサイトのcookie属性で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");
しかし、それは私を助けていないようです。
これを行うためのより良い方法を私に提案してください。
ありがとう。
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 = strictが追加されます。
Cookieを作成するときにコードでこれを設定することもできます。
var httpCookie = new HttpCookie("mycookie", "myvalue");
httpCookie.Path += ";SameSite=Strict";
Response.SetCookie(httpCookie);
これにより、次のヘッダーが表示されます。
Set-Cookie:mycookie=myvalue; path=/;SameSite=Strict
フレームワークにプッシュされるまで少しハック。
ここと他の場所にあるすべての情報を体系化するために私の答えを追加するだけです。
var c = new HttpCookie("test");
c.SameSite = SameSiteMode.Lax;
Web.config
<authentication mode="Forms">
<forms ..... cookieSameSite="Lax" />
</authentication>
Global.asax
void Session_Start(Object sender, EventArgs e)
{
Response.Cookies["ASP.NET_SessionId"].SameSite = SameSiteMode.Lax;
//while we're at it lets also make it secure
if (Request.IsSecureConnection)
Response.Cookies["ASP.NET_SessionId"].Secure = true;
}
おもしろいこと:<httpCookies requireSSL="true" />
を設定しても、何らかの理由でASP.NETセッションCookieは安全ではありません。
PDATE 01.2020:.NET 4.8セッションCookieがデフォルトで「SameSite」になりました
最新のWindows Updateをインストールすると、セッションCookieがLax
になります。
<httpCookies samesite=xxx>
は存在しません上記のコメントで提案されているように<httpCookies sameSite="Strict" />
をweb.configに追加しても機能せず、エラーが発生しました。
認識されない属性「samesite」
4.7.2を対象としていますが。複数のプロジェクトと複数のマシンでテストされ、VS2019はこれをインテリセンスで表示せず、MSドキュメントはどこにも言及していません。
.NET 4.7.2には、SameSite
プロパティのサポートが組み込まれています。HttpCookie
にSameSite
というプロパティが追加されました。
詳細情報を参照 ここ マイクロソフトから。
設定ファイルを通じてこれをハッキングする必要はもうありません。
SameSiteをASP.NET_SessionId Cookieに定義するには、system.webセクションの下にweb.configを設定する必要がありました。
<sessionState cookieSameSite="Lax" />
この時代には、同じ愚かなwebapi cookieバグを修正するためにowinを使用しているため...
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()の前にミドルウェアが登録されていることを確認してください
4.7.2より前のバージョンでは、Cookieパスに文字列を追加するだけで済みます。
FormsAuthentication.SetAuthCookie(username, false, FormsAuthentication.FormsCookiePath + "; SameSite=Lax");
https://www.nuget.org/packages/Microsoft.Owin.Security.Cookies/4.1. がSameSiteをサポートするようになりました。
ここでの他のソリューションがうまく機能しないため、これは非常に良いニュースです。
OwinMiddleware
の実装:パフォーマンスを除いて、うまく機能します。これは私たちの環境に固有のものかもしれませんが、そのソリューションは私たちのCPUの約10%でした。
<outboundRules>
:おそらく動作する可能性があります。ただし、これまでに確認してテストしたすべてのソリューション(このスレッドのソリューションを含む)では、同じ応答に複数のCookieが設定されていると、いくつかの問題が発生しました。