在带有Angular的ASP.NET Core中,CSRF令牌验证失败

问题描述

我正在尝试使用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 (将#修改为@)