代码之家  ›  专栏  ›  技术社区  ›  jengfad

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

  •  -1
  • jengfad  · 技术社区  · 7 年前

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

    展望全球。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
            }
    

    Application\u AuthenticateRequest 来自全球以外的地方。服务器端的asax?

    1 回复  |  直到 7 年前
        1
  •  0
  •   jengfad    7 年前

    我们在更新用户详细信息的api调用上附加了一个onExecuted操作过滤器。因为XSRF令牌是从HTTPContext生成的。当前,我们更新了线程。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);
        }
    }