如何在运行时设置防伪cookie域?

How to set anti-forgery cookie domain at run-time?

假设我有一个 ASP.NET 核心应用程序托管在 admin.xyz.com,我需要为 *.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 对象的地方。我想到了一个中间件,但我认为它太复杂了。

你知道一个简单的方法吗?提前致谢。

您可以替换显式设置域值的 CookieBuilder inside the AntiforgeryOptions and provide your own 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,
    };
});