2017-07-18 3 views
-1

Angenommen, ich habe ein Modul in meiner App, das den Benutzernamen ändern kann. Da der Benutzername geändert wird, sollte der Authcookie zusammen mit dem XSRF-Token aktualisiert werden.X-XSRF Token-Fehler für aktualisierten Benutzer

Beim Versuch, dies zu erhalten, bekomme ich eine Fehlermeldung, die besagt "Das mitgelieferte Anti-Fälschungs-Token war für Benutzer bestimmt ...". Nun, ich habe einen kleinen Hinweis, wie ich das lösen kann. Da das aktuelle XSRF-Token für den alten Benutzernamen und nicht für den aktualisierten war, daher dieser Fehler.

Mit Blick auf den Global.asax-Code würde sich die Änderung des Benutzernamens nur auf Application_AuthenticateRequest widerspiegeln. Ich habe auch die Application_PostAuthenticateRequest geändert, um die Erstellung eines neuen XSRF-Tokens für den aktualisierten Benutzernamen zu erzwingen, wenn bei der Überprüfung derselbe Fehler auftritt.

 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 
     } 

Nun meine eigentliche Frage ist, kann ich auslösen Application_AuthenticateRequest und Application_PostAuthenticateRequest von einem anderen als dem Global.asax auf Server-Seite?

Ich möchte dann sofort auslösen, nachdem der Benutzer den Benutzernamen aktualisiert hat.

+0

'Mein Problem ist, wenn ich Details für einen bestimmten Benutzer erfolgreich aktualisieren '- zeigen Sie uns bitte Ihren Code, der dies tut. – mjwills

+0

Das Aktualisieren eines Benutzers ist nur eine gespeicherte Prozedur, die in einem BL eingebettet ist. – jengfad

+0

Jede Chance, Sie könnten es mit uns teilen? – mjwills

Antwort

0

Wir haben einen onExecuted-Aktionsfilter für den API-Aufruf angehängt, auf den die Benutzerdetails aktualisiert wurden. Da das XSRF-Token aus HTTPContext.Current generiert wird, haben wir den Thread.CurrentPrincipal aktualisiert, um die aktualisierten Details wiederzugeben.

[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); 
    } 
} 
Verwandte Themen