问题描述
我正在尝试使用CSRF-Token保护我的应用程序,因此我使用了Angular文档。他们声明,如果在Cookies中您有一个名为XSRF-TOKEN的cookie,那么该cookie将自动提供给Headers的后端,的确如此。每当我从Angular Frontend App发出POST请求时,该cookie就会放入Headers(作为X-XSRF-TOKEN)。因此,我在ASP .NET Core中将默认的“防伪令牌令牌Cookie”名称更改为XSRF-TOKEN:
// Startup.cs
services.AddAntiforgery(options =>
{
options.HeaderName = "X-XSRF-TOKEN";
options.Cookie = new CookieBuilder()
{
Name = "XSRF-TOKEN"
};
});
我还提供了token属性作为请求流中的过滤器:
services.AddControllers(opt =>
{
opt.Filters.Add(typeof(LoadFilter),Int32.MinValue); // my other custom filter
opt.Filters.Add<AutovalidateAntiforgeryTokenAttribute>();
})
还有一种中间件负责将令牌存储在cookie中,并在POST请求到来时对其进行验证:
public class ValidateAntiForgeryTokenMiddleware
{
private readonly RequestDelegate _next;
private readonly IAntiforgery _antiForgery;
public ValidateAntiForgeryTokenMiddleware(RequestDelegate next,IAntiforgery antiForgery)
{
_next = next;
_antiForgery = antiForgery;
}
public async Task Invoke(HttpContext context)
{
if (HttpMethods.IsGet(context.Request.Method))
{
_antiForgery.GetAndStoretokens(context);
}
if (HttpMethods.IsPost(context.Request.Method))
{
await _antiForgery.ValidateRequestAsync(context);
}
await _next(context);
}
}
public static class ApplicationBuilderExtensions
{
public static IApplicationBuilder UseAntiForgeryTokens(this IApplicationBuilder app)
{
return app.UseMiddleware<ValidateAntiForgeryTokenMiddleware>();
}
}
现在,每当我向后端服务器发出GET请求时,都会设置XSRF-TOKEN cookie。 但是,当我使用具有相同值的XSRF-TOKEN cookie和X-XSRF-TOKEN标头发出POST请求时,出现错误。 第一个错误,在我的本地开发计算机上:
防伪令牌验证失败。提供的防伪令牌验证失败。 Cookie令牌和请求令牌已交换
在我的开发服务器上的第二个错误,即使代码相同,它也会产生另一个错误:
所需的防伪cookie“ .AspNetCore.Antiforgery.6zP9GDvCs-o”不存在。
此外,如果我在ValidateAntiForgeryTokenMiddleware中手动添加cookie,那么一切似乎都可以正常工作。但是然后,我有两个XSRF-TOKENS,这似乎不是一个很好的解决方案,因为当我认为一个cookie应该足够时,它将安全性放在了另外两个地方。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)