2010-12-15 13 views
0

Ich versuche Token-basierte Autorisierung für eine Asp.Net MVC2-Anwendung zu implementieren, und ich denke, dass mein Ansatz falsch ist. Zunächst einmal: von Token-basierten Autorisierung meine ich, dass, wenn ein nicht authentifizierter Benutzer http://myapp.com/some/action?tok=[special single-use token here] geht sie angemeldet sindBenutzer manuell mit Formularauthentifizierung anmelden

alle Controller in meiner Anwendung ein gemeinsames ApplicationController erweitern, so dass mein Ansatz OnAuthorize auf diesem Controller außer Kraft zu setzen war. folgt:

class ApplicationController 
{ 
    protected override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.QueryString["tok"] != null) 
     { 
      var token = HttpUtility.UrlDecode(filterContext.HttpContext.Request.QueryString["tok"]); 

      if ((var user = getUserByToken(token)) != null) 
      { 
       FormsAuthentication.SetAuthCookie(user.Email, false); 
      } 
      else{ /* highly-proprietary handling of invalid token */ } 
     } 
     base.OnAuthorization(filterContext); 
    } 
} 

ich bin absolut sicher dass SetAuthCookie, wenn es sollte und nicht aufgerufen aufgerufen wird werden, wenn es nicht sollte.

Das Problem ist, dass der Benutzer nicht wirklich loggt. Es setzt einen Cookie, was bedeutet, ich müsste umleiten (User.Identity.IsAuthenticated bleibt falsch nach dem Aufruf SetAuthCookie). Aber die ganze Idee darüber ist, das fortzusetzen Anfrage wie gewohnt und vermeiden Sie eine sinnlose Weiterleitung. Gibt es einen Weg, dieses Ziel zu erreichen? Es scheint nicht wirklich viel zu fragen ...

Antwort

0

Nachdem Sie SetAuthCookie aufgerufen haben, ändert sich nichts mit der User.Identity. Bei der nächsten Anfrage werden die Daten erwartet, was Sie erwarten. Das beste, was Sie hier tun können, ist eine Umleitung nach dem Aufruf von SetAuthCookie.

+0

Gibt es keine gute Möglichkeit, User.Identity festzulegen, um eine sofortige Anmeldung zu erzwingen? – notJim

+0

Ich möchte nicht sagen, es gibt keinen Weg, wie ich bin sicher, es gibt (HttpContext.User ist einstellbar), aber um es vollständig richtig zu machen, würden Sie alles tun wollen, dass ASP.NET tut, wenn a Bitte kommt zuerst herein, und wenn ich es wäre, wäre ich zu besorgt, dass etwas ausgelassen würde. Eine Weiterleitung ist meiner Meinung nach die sicherste Wette. Sie können auf die gleiche Seite umleiten (und möglicherweise die Abfragezeichenfolge abbrechen), es muss keine andere URL sein. –

+0

Ich bin jetzt mit der Weiterleitung gegangen, weil Sie im Grunde genommen alles gesagt haben, was passiert ist. Es scheint nur merkwürdig, dass es nicht anders ist, dies zu tun. Ich möchte sehen, ob andere Antworten eintreffen, aber wenn nicht, schätze ich, dass ich es dir gebe: P. – notJim

Verwandte Themen