2017-07-18 11 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 
     } 

今私の本当の問題は、私は、サーバー側でのGlobal.asax以外からApplication_AuthenticateRequestApplication_PostAuthenticateRequestをトリガすることができ、ありますか?

ユーザーがユーザー名を更新した直後にトリガーしたいと考えています。

+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); 
    } 
} 
関連する問題