[英]Antiforgery throws bad request in asp.net core web api angular
我正在尝试通过在启动文件中添加过滤器来向我的 asp.net core 3.1 web API 添加防伪。
options => options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute())
此 Web API 由托管在不同端口中的我的 angular 应用程序使用。 我已经完成了 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 应用程序,所有这些都托管在不同的端口中。 完成后,angular 应用程序将重定向到身份服务器进行身份验证,它将重定向回我的客户端应用程序。 我已经在 Web API 中设置了这个 csrf。 所以基本上,身份验证是使用不记名令牌进行的。 我知道我们不需要 csrf 保护,因为我们已经使用不记名令牌作为我的身份验证机制。 但我也需要它为 csrf 工作。 有没有办法实现这一目标?
我有类似的流程,我遇到了类似的问题。 就我而言,我没有使用 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 部分分开在两个单独的端点中并发出两个请求,一切按预期工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.