【问题标题】:Using the antiforgery cookie in ASP.NET Core but with a non-default CookieName在 ASP.NET Core 中使用防伪 cookie,但使用非默认 CookieName
【发布时间】:2017-03-23 12:10:33
【问题描述】:

我正在考虑更改 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?

【问题讨论】:

    标签: asp.net asp.net-mvc cookies asp.net-core asp.net-core-mvc


    【解决方案1】:

    您可以在 Startup.ConfigureServices 中设置不同的名称,如下所示:

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

    对于.Net Core 2.0.0 or greater there will be changes

    参考: 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 的代码)。您可能还想更改标头/表单名称,例如使用 Angular 并将标头更改为标准 Angular XSRF 令牌标头的官方 Antiforgery repo has an example

    为了使用它,请将[ValidateAntiForgeryToken] 添加到 GET 请求以外的控制器操作中。

    只要您使用 asp 表单标签助手,您就不必对标准 html 表单做任何其他事情,请参阅this question

    如果您使用 ajax 请求,那么您将需要在您的请求中包含一个标头或一个包含生成令牌的字段。你基本上需要:

    1. 获取IAntiforgery
    2. 致电var tokenSet = antiforgery.GetAndStoreTokens(httpContext);
    3. 使其可用于您的 js 代码,以便它知道值 tokenSet.RequestToken 将作为名称为 tokenSet.FormFieldName 的字段或名称为 tokenSet.HeaderName 的标头包含在每个 ajax 请求中。

    目标是让 POST/PUT/DELETE/PATCH 请求包含 2 个内容:

    • 防伪cookie
    • 带有令牌的字段/标题

    所以防伪中间件可以验证没有 XSRF。


    关于 cookie 名称/域的更新

    合理的默认设置是每个应用程序都有自己的 cookie。您通常使用默认方法得到它,因为 cookie 上没有专门设置域,因此 cookie 从请求中获取域。这意味着不同的应用程序使用不同的 cookie,除非应用程序托管在同一个域中。

    • 阅读更多关于 cookie 工作原理的信息here

    您可能只想在特殊情况下共享 cookie,例如,如果您有 2 个应用程序,其中应用程序 A 中的一个表单发布到应用程序 B。在这些情况下,请确保您使用的域/子域与这两个应用程序以及两者都匹配使用相同的 cookie 名称。

    • 阅读有关 XSRF 的更多信息here

    【讨论】:

    • 不同的 ASP.NET Core Web 应用程序是否应该在防伪 cookie 上有不同的 cookie 名称?使用默认防伪cookie时,用户浏览器中只有一个.AspNetCore.Antiforgery.xxxxxxx...
    • 为请求的域存储没有特定域的 Cookie,请参阅this question。也许您在本地运行多个站点,因此它们都将 localhost 作为域?我还注意到他们有recently changed Antiforgery,所以AntiforgeryOptions 暴露了新的CookieDomainCookiePath 属性。
    • 是的,目前我所有的 Web 应用程序共享同一个域,这可能是只创建一个防伪 cookie 的原因。但这是推荐的方法还是每个 Web 应用程序都应该有单独的防伪 cookie?我将此添加到问题中。
    • 合理的默认设置是每个应用程序都有自己的 cookie。您通常使用默认方法得到它,因为没有在 cookie 上专门设置域,因此 cookie 假定请求的域。您可能只想在特殊情况下共享 cookie,例如,如果您有 2 个应用程序,其中一个表单发布到第二个应用程序。在这种情况下,请确保您在两个应用程序中都设置了 cookie 名称和域。
    • 我的网页没有生成默认cookie是什么意思?
    猜你喜欢
    • 2018-12-17
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2011-08-01
    • 2017-07-06
    • 2022-08-16
    相关资源
    最近更新 更多