-1

假设我的应用中有一个可以更改用户名的模块。由于用户名已更改,因此 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

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

4

1 回答 1

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);
    }
}
于 2017-07-21T06:27:08.307 回答