更新用户的 X-XSRF 令牌错误

X-XSRF Token error for updated user

假设我的应用程序中有一个可以更改用户名的模块。由于用户名已更改,authcookie 应与 XSRF 令牌一起更新。

尝试此操作时,我收到一条错误消息 "The provided anti-forgery token was meant for user..."。好吧,我得到了一些关于如何解决这个问题的提示。由于当前的 XSRF 令牌用于旧用户名而不是更新后的用户名,因此出现此错误。

查看 Global.asax 代码,用户名的更改只会反映在 Application_AuthenticateRequest 上。我还修改了 Application_PostAuthenticateRequest 以强制在更新后的用户名上创建一个新的 XSRF 令牌,如果在验证时它会遇到同样的错误。

        protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
        {
            var existingXsrfCookie = Request.Cookies["XSRF-TOKEN"];
            // logic for parsing XSRF-TOKEN
            try
            {
                ...more logic
                AntiForgery.Validate(currentCookieToken, currentFormToken);
                return;
            }
            catch (Exception ex)
            {
                Logger.ErrorException(ex.Message, ex);
            }

            // logic for creating new XSRF token
        }

现在我真正的问题是,我可以从服务器端的 Global.asax 以外的地方触发 Application_AuthenticateRequestApplication_PostAuthenticateRequest 吗?

我想在用户更新用户名后立即触发。

我们在更新用户详细信息的 api 调用上附加了一个 onExecuted 操作过滤器。由于 XSRF 令牌是从 HTTPContext.Current 生成的,我们更新了 Thread.CurrentPrincipal 以反映更新后的详细信息。

[AntiForgeryUpdate]
[HttpPost]
public async Task<EditUserResponse> editUser (EditUserRequest request)
{
   try
   {
     //code for updating user
     var principal = Request.GetRequestContext().Principal;
     var identity = principal.Identity;
     identity.IdentityInfo = changedUser;
   }
   catch(Exception ex)
   {
      throw;
   }
}


public class AntiForgeryUpdate: ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        if (actionExecutedContext.Request.Method != HttpMethod.Get)
        {
            AntiForgery.GetTokens(null, out string cookieToken, out string formToken);
            var token = cookieToken + ":" + formToken;

            actionExecutedContext.Response.Headers.AddCookies("XSRF-TOKEN", token);
        }
        base.OnActionExecuted(actionExecutedContext);
    }
}