如何在运行时设置防伪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,
};
});
假设我有一个 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,
};
});