2009-05-27 2 views
1

J'utilise avec succès l'autorisation personnalisée dans ASP.NET MVC. Cela implique simplement une comparaison entre User.Identity et le propriétaire de l'objet en contexte.Autorisation et liens hypertexte ASP.NET MVC

Il fonctionne comme un charme lorsqu'il est utilisé dans des conditions simples. Cela devient plus compliqué quand j'essaie d'appeler 2 actions dans une requête web. Je veux dire que je veux afficher une image qui serait générée à la volée par mon application. Cette image est générée par un contrôleur, elle peut donc être référencée par une URL même si elle n'existe pas physiquement. J'ai décidé que l'utilisateur doit être connecté et être le propriétaire pour l'afficher, donc j'applique mon mécanisme d'autorisation.

Exemple: < img src = "http://myapplication.com/images/generate/3"/>

Quand je possède une telle image dans une page via son lien d'action, je pense que l'authentification l'utilisateur sera toujours en contexte du côté serveur lorsque l'image est en cours de génération. Ce n'est pas le cas dans mes tests. L'image ne s'affiche jamais car ma vérification d'autorisation ne fonctionne pas. Dans le contrôleur d'image, User.Identity est vide comme si l'utilisateur ne l'avait pas signé.

En attendant, le même utilisateur est toujours connecté au site Web et peut continuer à naviguer avec son identité en contexte ... sans que ces images fonctionnent correctement.

Je me demande comment faire fonctionner ce processus en toute sécurité ...

Merci beaucoup!

Marc Lacoursiere RooSoft Informatique inc.

Répondre

1

me demandais si vous avez vérifié si

Thread.CurrentPrincipal 

est également vide dans le contrôleur? Il devrait contenir la même valeur.

Une autre suggestion serait de stocker la valeur User.Identity dans une session?

+0

Etes-vous sûr que les deux requêtes seront effectuées sur le même thread? – RooSoft

+0

Je ne vois pas pourquoi il y aurait deux threads? D'abord une demande est faite pour rendre la page avec votre balise img à l'intérieur (pas les bits réels de l'image). Ensuite, une fois que le navigateur affiche votre balise img, une demande est faite à votre contrôleur pour obtenir votre image. Dans les deux cas, il n'y a qu'un seul thread actif? – Peter

+0

Je me demande si nous pouvons compter sur ce fait en raison de la nature sans état d'ASP.NET MVC en premier lieu ... En théorie, sur une configuration d'équilibrage de charge, les deux demandes pourraient être faites sur deux serveurs différents, qui implique deux threads différents. – RooSoft

1

Vous devez configurer votre identité dans global.asax à chaque demande. J'utilise un Principal et une Identité personnalisés pour cela.

private void Application_AuthenticateRequest(object sender, EventArgs e) 
{ 
    if (!Request.IsAuthenticated) 
    { 
     SetIdentity(new MyIdentity 
        { Type = UserType.Inactive, Id = int.MinValue }); 
    } 
    else 
    { 
     HttpCookie authCookie = Request.Cookies[ 
      FormsAuthentication.FormsCookieName]; 
     if (authCookie != null) 
     { 
      FormsAuthenticationTicket authTicket = 
        FormsAuthentication.Decrypt(authCookie.Value); 

      var identity = Repository.GetIdentity 
        (authTicket.Name, new HttpRequestWrapper(Request)); 
      SetIdentity(identity); 
     } 
    } 
} 

private void SetIdentity(MyIdentity identity) 
{ 
    Context.User = new MyPrincipal { Identity = identity }; 
    Thread.CurrentPrincipal = Context.User; 
} 

Cela fonctionne, mais je ne le garantis pas pour être sécurisé. Vous devriez passer en revue cet article sur FormsAuthentication vulnerabilities avant d'aller vivre avec ce code. Vous devez comprendre que ce code suppose que le cookie est valide et n'a pas été piraté. Certaines mesures de sécurité supplémentaires peuvent être prises pour réduire ces vulnérabilités que ce code ne montre pas.

1

Cela peut être lorsque le lien du site dans le navigateur est http: \ www.mysite.com (ou http: \ subdomain.mysite.com) et que vous utilisez http: \ mysite.com \ image \ 5 dans votre application . L'authentification par formulaire utilise des cookies. Et ces cookies peuvent appartenir à des domaines et sous-domaines.
Pour savoir ce qui se passe, je suggère d'utiliser FireFox avec FireBug installé. Activez l'onglet Net et Console de votre site et actualisez complètement la page. Après, vous verrez les demandes dans l'un de ces onglets (onglet net exactement). À la gauche de la demande, vous pouvez voir un bouton «plus». Après avoir cliqué dessus, vous verrez les onglets En-têtes et Réponse (more detailed description of firebug). Jetez un oeil à l'onglet En-têtes et essayez de trouver quelque chose comme FORMAUTH (ou ce que vous avez défini dans config comme un nom de cookie de formulaires). Si vous ne le voyez pas, le problème est dans les domaines.