gpt4 book ai didi

asp.net-mvc - 防伪验证异常 : The provided anti forgery token was meant for a different claims-based user than the current user

转载 作者:行者123 更新时间:2023-12-01 21:47:49 25 4
gpt4 key购买 nike

我不确定这里发生了什么,但我在我的 cookie 中看到 2 个不同的标记。一个是“XSRF-TOKEN”,另一个是“.AspNetCore.Antiforgery.OnvOIX6Mzn8”,它们具有不同的值。

我使用的是 ASP.Net Core 2.1,带有 SPA 设置(前端有 Angular),并且 Startup.cs 中有以下内容。

我不知道是什么创建了后一个 token ,因为它似乎不是来 self 添加的任何代码。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IAntiforgery antiforgery)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler(
builder =>
{
builder.Run(
async context =>
{
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
context.Response.Headers.Add("Access-Control-Allow-Origin", "*");

var error = context.Features.Get<IExceptionHandlerFeature>();
if (error != null)
{
context.Response.AddApplicationError(error.Error.Message);
await context.Response.WriteAsync(error.Error.Message).ConfigureAwait(false);
}
});
});
}

app.UseAuthentication();
app.UseHttpsRedirection();
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseJwtTokenMiddleware();
app.UseSpaStaticFiles();
app.UseCookiePolicy();

app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action=Index}/{id?}");
});

app.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";
spa.UseSpaPrerendering(options =>
{
options.BootModulePath = $"{spa.Options.SourcePath}/dist/server/main.js";
options.BootModuleBuilder = env.IsDevelopment()
? new AngularCliBuilder(npmScript: "build:ssr")
: null;
options.ExcludeUrls = new[] { "/sockjs-node" };
});

if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start");
}
});

app.UseMiddleware<AntiForgeryMiddleware>("XSRF-TOKEN");
}
}

public static class ApplicationBuilderExtensions
{
public static IApplicationBuilder UseAntiforgeryTokenMiddleware(this IApplicationBuilder builder, string requestTokenCookieName)
{
return builder.UseMiddleware<AntiForgeryMiddleware>(requestTokenCookieName);
}
}

public class AntiForgeryMiddleware
{
private readonly RequestDelegate next;
private readonly string requestTokenCookieName;
private readonly string[] httpVerbs = new string[] { "GET", "HEAD", "OPTIONS", "TRACE" };

public AntiForgeryMiddleware(RequestDelegate next, string requestTokenCookieName)
{
this.next = next;
this.requestTokenCookieName = requestTokenCookieName;
}

public async Task Invoke(HttpContext context, IAntiforgery antiforgery)
{
if (httpVerbs.Contains(context.Request.Method, StringComparer.OrdinalIgnoreCase))
{
var tokens = antiforgery.GetAndStoreTokens(context);

context.Response.Cookies.Append(requestTokenCookieName, tokens.RequestToken, new CookieOptions()
{
HttpOnly = false
});
}

await next.Invoke(context);
}

}

最佳答案

示例中的 .AspNetCore.Antiforgery.OnvOIX6Mzn8 cookie 是通过调用 GetAndStoreTokens 生成的。此调用生成两个 token :

  1. “Cookie token ”:这就是编写为 .AspNetCore.Antiforgery.OnvOIX6Mzn8 的内容。
  2. “请求 token ”:这是一个与“Cookie token ”配对的单独 token 。您自己将此值写为 Cookie(即 XSRF-TOKEN),如代码中所示。

如果您检查生成的值 token 的值,您可以在示例中看到这一点。它有两个令人感兴趣的属性:RequestTokenCookieTokenGetAndStoreTokens 调用正在写出 CookieToken 值,而您的代码正在写出 RequestToken 值,这解释了为什么您会在两个不同的 cookie。

您为此获得的代码似乎直接来自 docs ,这解释了:

...uses middleware from the app's home page to generate an antiforgery token and send it in the response as a cookie (using the default Angular naming convention described later in this topic)...

当向服务器发送需要根据防伪规则进行验证的请求时,需要 cookie 和相应的 header 。 ASP.NET Core 防伪系统在验证过程中将“请求 token ”和“Cookie token ”匹配在一起。

在文档的下面,您将看到:

...using local storage to store the antiforgery token on the client and sending the token as a request header is a recommended approach.

下面的 JavaScript 示例展示了如何使用自定义请求 header (即 RequestVerificationToken)将 RequestToken 值添加到 XHR 请求。文档还显示,在 ASP.NET Core DI 系统中注册防伪服务时可以更改此 header :

services.AddAntiforgery(options => options.HeaderName = "X-CSRF-TOKEN");

您需要读取 Angular 应用程序中的 XSRF-TOKEN cookie 的值,并将其与 API 请求一起发送回服务器。您可以使用默认的 header 名称(如上所述)或自定义它(也在上面提到)。 @Sal 在他的回答中指出,只要 cookie 名称为 XSRF-TOKEN ( this is also the same for Angular ),AngularJs 就有一个内置机制。

希望这能解释这两个 token 和一般的防伪过程。然而,由于您正在为 Angular 的默认 HttpClient XSRF 保护编写一个正确命名的 cookie,因此我希望所有这方面的配置都正确。

就你的问题可能出在哪里而言,我怀疑这一行的位置:

app.UseMiddleware<AntiForgeryMiddleware>("XSRF-TOKEN");

鉴于这是管道设置代码中的最后一个调用,它只会在 MVC 管道之后运行,并且仅在 MVC 管道不处理请求的情况下运行。要解决此问题,请将调用移至上方 UseMvc - 这可能有点激进,因为它会生成超出必要数量的新“请求 token ”,但它会确认这是否是您的问题。

关于asp.net-mvc - 防伪验证异常 : The provided anti forgery token was meant for a different claims-based user than the current user,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51312665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com