在 azure 中部署时未在 cookie 中设置防伪令牌
Antiforgery token not set in the cookie when deployed in azure
我有两个应用程序服务,一个是 angular 应用程序,另一个是 .NET core 2.0 应用程序。我从后者创建防伪令牌并为每个请求附加一个 header,以便它在前者中设置为 cookie。
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddAntiforgery(options =>
{
options.HeaderName = "X-XSRF-TOKEN";
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.Cookie.HttpOnly = false;
options.Cookie.SameSite = SameSiteMode.None;
});
...
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseCookiePolicy(new CookiePolicyOptions
{
MinimumSameSitePolicy = SameSiteMode.None
});
app.UseAntiforgeryTokenMiddleware("X-XSRF-TOKEN");
....
AntiForgeryMiddleware.cs
public async Task Invoke(HttpContext context, IAntiforgery antiforgery, ILogger<AntiForgeryMiddleware> logger)
{
string path = context.Request.Path.Value;
if (path != null && path.ToLower().Contains("/api/account/authorizeview"))
{
if (httpVerbs.Contains(context.Request.Method, StringComparer.OrdinalIgnoreCase))
{
var tokens = antiforgery.GetAndStoreTokens(context);
context.Response.Cookies.Append(requestTokenCookieName, tokens.RequestToken, new CookieOptions()
{
HttpOnly = false,
Secure = true
});
}
}
context.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
await next.Invoke(context);
}
在 Angular 应用中设置了 withCredentials: true
。
这在 localhost 中有效,但当部署到 azure 时,cookie 未在 Chrome 中设置。在 Microsoft Edge 中,cookie 在响应中显示为屏幕截图,但在应用程序存储中不显示。
我们无法从顶级域为 azurewebsites.net
的子域访问 cookie,因为它列在 public 前缀列表中。
更多详情:
我有两个应用程序服务,一个是 angular 应用程序,另一个是 .NET core 2.0 应用程序。我从后者创建防伪令牌并为每个请求附加一个 header,以便它在前者中设置为 cookie。
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddAntiforgery(options =>
{
options.HeaderName = "X-XSRF-TOKEN";
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.Cookie.HttpOnly = false;
options.Cookie.SameSite = SameSiteMode.None;
});
...
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseCookiePolicy(new CookiePolicyOptions
{
MinimumSameSitePolicy = SameSiteMode.None
});
app.UseAntiforgeryTokenMiddleware("X-XSRF-TOKEN");
....
AntiForgeryMiddleware.cs
public async Task Invoke(HttpContext context, IAntiforgery antiforgery, ILogger<AntiForgeryMiddleware> logger)
{
string path = context.Request.Path.Value;
if (path != null && path.ToLower().Contains("/api/account/authorizeview"))
{
if (httpVerbs.Contains(context.Request.Method, StringComparer.OrdinalIgnoreCase))
{
var tokens = antiforgery.GetAndStoreTokens(context);
context.Response.Cookies.Append(requestTokenCookieName, tokens.RequestToken, new CookieOptions()
{
HttpOnly = false,
Secure = true
});
}
}
context.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
await next.Invoke(context);
}
在 Angular 应用中设置了 withCredentials: true
。
这在 localhost 中有效,但当部署到 azure 时,cookie 未在 Chrome 中设置。在 Microsoft Edge 中,cookie 在响应中显示为屏幕截图,但在应用程序存储中不显示。
我们无法从顶级域为 azurewebsites.net
的子域访问 cookie,因为它列在 public 前缀列表中。
更多详情: