Asp.net

在 ASP.NET Core 中使用防偽 cookie,但使用非預設 CookieName

  • September 29, 2020

我正在考慮更改 ASP.NET Core 中預設防偽 cookie 的名稱。

我想更改 cookie 名稱的原因是為了匿名化 cookie,在我看來,最終使用者沒有理由能夠確定該 cookie 的責任。

Microsoft.AspNetCore.Antiforgery.AntiforgeryOptions.CookieName

  1. 如何更改防偽 cookie 的名稱?我想它應該以某種方式在Startup.cs文件中完成?
  2. 更改預設防偽 cookie 的名稱可能會產生什麼影響?
  3. 如何在 ASP.NET Core 中使用防偽 cookie?
  4. 不同的 Web 應用程序(使用相同的域)應該共享一個防偽 cookie,還是應該為每個 Web 應用程序創建單獨的防偽 cookie?

您可以在您的Startup.ConfigureServicesas 中設置不同的名稱:

services.AddAntiforgery(opts => opts.CookieName = "MyAntiforgeryCookie");

對於.Net Core 2.0.0 或更高版本,會有一些變化

參考: https ://docs.microsoft.com/en-us/dotnet/api/Microsoft.AspNetCore.Antiforgery.AntiforgeryOptions?view=aspnetcore-2.0

對於以下用途:

services.AddAntiforgery(opts => opts.Cookie.Name = "MyAntiforgeryCookie");

預設情況下AddMvc()內部呼叫AddAntiforgery(),這意味著您獲得預設的 cookie、標題和表單名稱。如果您需要/想要使用不同的名稱,您可以通過如上所述手動呼叫 AddAntiforgery 來實現。

如果您更改 cookie 名稱,應該不會對您的應用程序產生任何影響(除非您自己添加了手動使用該 cookie 的程式碼)。您可能還想更改標頭/表單名稱,例如官方 Antiforgery repo有一個使用 Angular 並將標頭更改為標準 Angular XSRF 令牌標頭的範例。

為了使用它,請將[ValidateAntiForgeryToken]GET 請求以外的控制器操作添加到控制器中。

只要您使用 asp 表單標籤助手,您就不必對標準 html 表單執行任何其他操作,請參閱此問題

如果您使用 ajax 請求,那麼您將需要在您的請求中包含一個標頭或一個包含生成令牌的欄位。你基本上需要:

  1. 得到一個IAntiforgery
  2. 稱呼var tokenSet = antiforgery.GetAndStoreTokens(httpContext);
  3. 使其可用於您的 js 程式碼,以便它知道tokenSet.RequestToken要包含在每個 ajax 請求中作為具有名稱的欄位tokenSet.FormFieldName或具有名稱的標頭的值。tokenSet.HeaderName
  • 一些選項,例如將令牌渲染到 js 佈局中腳本部分內的 JS 對象,添加一個 JS 可讀 cookie,如 angular 範例中一樣,繼續渲染包含在 ajax 請求中的隱藏欄位
  • 此答案中的選項有一個很好的概述

目的是讓 POST/PUT/DELETE/PATCH 請求包含兩件事:

  • 防偽餅乾
  • 帶有令牌的欄位/標題

所以防偽中間件可以驗證沒有 XSRF。


關於 cookie 名稱/域的更新

合理的預設設置是每個應用程序都有自己的 cookie。您通常使用預設方法得到它,因為 cookie 上沒有專門設置域,因此 cookie 從請求中獲取域。這意味著不同應用程序的 cookie 不同,除非應用程序託管在同一個域中。

  • 在此處閱讀有關 cookie 工作原理的更多資訊

您可能只想在特殊情況下共享 cookie,例如,如果您有 2 個應用程序,其中應用程序 A 中的表單發佈到應用程序 B。在這些情況下,請確保您使用與兩個應用程序匹配的域/子域,並且兩者都使用相同餅乾名稱。

引用自:https://stackoverflow.com/questions/40511103