【问题标题】:Antiforgery throws bad request in asp.net core web api angularAntiforgery 在 asp.net core web api angular 中抛出错误的请求
【发布时间】:2021-02-28 10:24:30
【问题描述】:

我正在尝试通过在启动文件中添加过滤器来为我的 asp.net core 3.1 Web API 添加防伪功能。

options => options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute())

我的 Angular 应用程序使用此 Web API,该应用程序托管在不同的端口中。我已经完成了 Microsoft 文档中指定的所有配置,如下所示。

app.Use(next => context =>
        {
            string path = context.Request.Path.Value;
            if (path != null)
            {
                var tokens = antiforgery.GetAndStoreTokens(context);
                context.Response.Cookies.Append("XSRF-TOKEN",
                  tokens.RequestToken, new CookieOptions
                  {
                      HttpOnly = false,
                      Path = "/",
                  }
                );
            }
            return next(context);
        });

在服务中

services.AddAntiforgery(options =>
        {
            options.HeaderName = "X-XSRF-TOKEN";
        });

它会生成两个令牌,一个是.Asp.NetCore.AntiForgery 和 XSRF-TOKEN。我在我的客户端应用程序中获取此令牌并将其作为请求标头作为 x-xsrf-token 发送到 API,但每次都失败。我已经设置了我的 cors 以允许任何来源。我在我的 Angular 应用程序中得到如下令牌。

let xsrfToken = this.xsrfTokenExtractor.getToken() as string;
  if(xsrfToken){
    request = request.clone({headers: request.headers.set("X-XSRF-TOKEN", xsrfToken)});
  }

让我向你解释一下我的流程。我有一个身份服务器、Web API 和 Angular 应用程序,它们都托管在不同的端口中。一旦完成,角度应用程序将重定向到身份服务器进行身份验证,它将被重定向回我的客户端应用程序。我已经在 Web API 中设置了这个 csrf。所以基本上,身份验证是使用不记名令牌进行的。我知道我们不需要 csrf 保护,因为我们已经使用不记名令牌作为我的身份验证机制。但我也需要它为 csrf 工作。有什么方法可以实现吗?

【问题讨论】:

    标签: c# angular asp.net-core asp.net-core-webapi antiforgerytoken


    【解决方案1】:

    我有类似的流程,我遇到了类似的问题。在我的例子中,我没有使用 Configure 方法,而是创建了一个单独的 Endpoint,允许我请求 cookie。

    var aft = _antiForgery.GetAndStoreTokens(HttpContext);
                Response.Cookies.Append("XSRF-TOKEN", aft.RequestToken, new CookieOptions
                {
                    HttpOnly = false,
                    Secure = true,
                    Domain = config.Domain
                });
    

    最初我在同一个请求中记录部分 cookie 部分,这导致每个请求都被 400 Bad Request 令牌拒绝 但是一旦我将登录部分和 cookie 部分分开在两个单独的端点中并提出了两个请求,一切都按预期进行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-30
      • 2022-12-11
      • 2021-01-21
      • 1970-01-01
      • 2022-01-18
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多