【问题标题】:How to set anti-forgery cookie domain at run-time?如何在运行时设置防伪 cookie 域?
【发布时间】:2020-01-05 03:09:57
【问题描述】:

假设我有一个托管在 admin.xyz.com 的 ASP.NET Core 应用程序,我需要为 *.xyz.com 设置防伪 cookie。我目前正在配置防伪服务,例如:

services.AddAntiforgery(opts =>
{
    opts.HeaderName = ANTIFORGERY_HEADER_NAME;
    opts.Cookie.Name = ANTIFORGERY_COOKIE_NAME;
});

我可以以这种方式静态设置域opts.Cookie.Domain = "xyz.com",但我正在寻找一种在运行时执行此操作的方法,例如:

Domain = string.Join('.', Request.Host.Host.Split('.').Skip(1));

或者在我可以访问HttpContext 对象的地方。我想到了一个中间件,但我认为它太复杂了。

您知道执行此操作的简单方法吗?提前致谢。

【问题讨论】:

    标签: c# asp.net-core-2.1


    【解决方案1】:

    您可以替换 AntiforgeryOptions 中的 CookieBuilder 并提供您自己的 Build 实现,以显式设置域值。

    类似这样的:

    public class CurrentDomainCookieBuilder : CookieBuilder
    {
        public override CookieOptions Build(HttpContext context, DateTimeOffset expiresFrom)
        {
            if (string.IsNullOrEmpty(Domain))
                Domain = string.Join('.', context.Request.Host.Host.Split('.').Skip(1));
    
            return base.Build(context, expiresFrom);
        }
    }
    

    然后在配置 Antiforgery 时,使用新的构建器:

    services.AddAntiforgery(options =>
    {
        options.Cookie = new CurrentDomainCookieBuilder
        {
            // default configuration for Antiforgery cookies
            SameSite = SameSiteMode.Strict,
            HttpOnly = true,
            IsEssential = true,
            SecurePolicy = CookieSecurePolicy.None,
        };
    });
    

    【讨论】:

      猜你喜欢
      • 2019-05-13
      • 2020-04-27
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 2017-06-09
      • 2013-11-19
      • 2010-11-14
      • 2012-01-28
      相关资源
      最近更新 更多