2010-12-15 80 views
0

J'essaie d'implémenter l'autorisation basée sur des jetons pour une application Asp.Net MVC2, et je pense que mon approche est incorrecte. Tout d'abord: par autorisation à base de jetons, je veux dire que lorsqu'un utilisateur non authentifié va http://myapp.com/some/action?tok=[special single-use token here] ils sont connectésConnectez-vous manuellement avec l'authentification par formulaires

Tous les contrôleurs dans mon application s'étendre un ApplicationController, donc mon approche était de passer outre OnAuthorize commune sur ce contrôleur comme. suit:

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

Je suis absolument certain que SetAuthCookie est appelé quand il doit et ne pas être appelé quand il ne devrait pas. Le problème est que cela ne connecte pas vraiment l'utilisateur. Il définit un cookie, ce qui signifie que je devrais rediriger (User.Identity.IsAuthenticated reste faux après avoir appelé SetAuthCookie.) Mais l'idée est de continuer le demander comme d'habitude et éviter une redirection inutile. Y a-t-il un moyen d'atteindre cet objectif? Cela ne semble pas vraiment demander beaucoup ...

Répondre

0

Après avoir appelé SetAuthCookie, rien ne change avec User.Identity. À la prochaine demande, les données seront ce que vous attendez. La meilleure chose à faire ici est d'émettre une redirection après l'appel de SetAuthCookie.

+0

N'existe-t-il pas un bon moyen de définir User.Identity, essentiellement pour forcer une connexion immédiate? – notJim

+0

Je ne veux pas dire qu'il n'y a pas moyen, car je suis sûr qu'il y a (HttpContext.User est réglable), mais pour le faire complètement correct, vous voudriez faire tout ce que fait ASP.NET quand un la première demande arrive, et si c'était moi, je serais trop inquiet que quelque chose soit oublié. Une redirection, à mon avis, est le pari le plus sûr. Vous pouvez rediriger vers la même page (et peut-être quitter la chaîne de requête), il ne doit pas être une URL différente. –

+0

Je suis allé avec la redirection pour l'instant, à cause de ce que vous avez dit en étant sûr que tout ce qui doit arriver arrive. Il semble juste étrange qu'il n'y ait pas un différent pour le faire. Je veux voir si d'autres réponses arrivent, mais si non, je suppose que je vais vous le donner: P. – notJim