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

时间:2017-07-18 11:33:50

标签: c# asp.net csrf x-xsrf-token

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

尝试此操作后,我收到一条错误消息"提供的防伪令牌适用于用户......"。好吧,我得到了一些如何解决这个问题的提示。由于当前的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吗?

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

1 个答案:

答案 0 :(得分:0)

我们在更新了用户详细信息的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);
    }
}