2017-07-18 21 views
-1

假設我的應用程序中有一個模塊可以更改用戶名。由於用戶名已更改,authcookie應與XSRF令牌一起更新。已更新用戶的X-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 
     } 

現在我真正的問題是,我可以觸發Application_AuthenticateRequestApplication_PostAuthenticateRequest其他比在Global.asax在服務器端?

我想在用戶更新用戶名後立即觸發。

+0

'我的問題是,當我成功更新特定用戶的詳細信息時 - 請向我們顯示您的代碼。 – mjwills

+0

用戶的更新只是嵌入BL中的存儲過程。 – jengfad

+0

有沒有機會與我們分享? – mjwills

回答

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); 
    } 
}