【发布时间】: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