Contexte.L'utilisateur de perdre des Rôles après avoir été affecté au Mondial.asax.Application_AuthenticateRequest

StackOverflow https://stackoverflow.com/questions/56271

Question

Je suis à l'aide de l'authentification par Formulaires dans mon asp.net (3.5) de l'application.Je suis également en utilisant des rôles à définir ce que l'utilisateur peut accéder à qui les sous-répertoires de l'application.Ainsi, les articles pertinents de mon web.fichier de configuration ressemble à ceci:

<system.web>
  <authentication mode="Forms">
    <forms loginUrl="Default.aspx" path="/" protection="All" timeout="360" name="MyAppName" cookieless="UseCookies"  />      
  </authentication>
  <authorization >
    <allow users="*"/>
  </authorization>
</system.web>

<location path="Admin">
  <system.web>
    <authorization>
      <allow roles="Admin"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>

Basé sur ce que j'ai lu, ce qui devrait garantir que les seuls utilisateurs de pouvoir accéder à l'Admin de l'annuaire seront les utilisateurs qui ont été Authentifiés et attribuer le rôle d'Administrateur.

L'authentification de l'utilisateur, l'enregistrement du ticket d'authentification, et d'autres questions connexes, tous les beaux travaux.Si je supprime les balises à partir du web.fichier de config, tout fonctionne bien.Le problème c'est quand j'essaie de la faire respecter seuls les utilisateurs avec le rôle d'Administrateur doit être en mesure d'accéder le répertoire Admin.

Sur cette base Article base de connaissances microsoft le long de avec d'autres pages web donnant les mêmes informations, j'ai ajouté le code suivant dans mon Global.asax fichier:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
    if (HttpContext.Current.User != null) {
        if (Request.IsAuthenticated == true) {    
            // Debug#1            
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies[FormsAuthentication.FormsCookieName].Value);
            // In this case, ticket.UserData = "Admin"                
            string[] roles = new string[1] { ticket.UserData }; 
            FormsIdentity id = new FormsIdentity(ticket);
            Context.User = new System.Security.Principal.GenericPrincipal(id, roles);
            // Debug#2
        }
    }
}

Cependant, lorsque j'essaie de me connecter, je n'arrive pas à accéder au dossier Admin (redirigé vers la page de login).

Essayez de déboguer le problème, si je fais un pas de travers une demande, si j'exécute le Contexte.De l'utilisateur.IsInRole("Admin") à la ligne marquée Debug#1 ci-dessus, il renvoie une valeur false.Si j'exécute la même instruction à la ligne Debug#2, il est égal à true.Donc, au moins autant que Mondiale.asax, le Rôle est correctement attribué.

Après Le Mondial.asax, l'exécution saute à droite de la page de Connexion (comme l'absence de rôle provoque le chargement de la page dans le dossier admin être rejeté).Cependant, lorsque j'exécute la même instruction sur la première ligne de Page_Load de la connexion, elle retourne false.Donc quelque part après Application_AuthenticateRequest Mondiale.asax et de la charge initiale de la WebForm dans le répertoire restreint, le rôle de l'information est en train de disparaître, entraînant l'échec de l'authentification (note:dans Page_Load, le bon ticket d'Authentification est toujours attribué à un Contexte.De l'utilisateur.Id - seulement le rôle est d'être perdu).

Ce que je fais mal, et comment puis-je le faire fonctionner correctement?


Mise à jour:Je suis entré à l' la solution ci-dessous

Était-ce utile?

La solution

Ici était le problème et la solution:

Plus tôt dans le développement, j'étais allé sur le Site de menu et clique sur Asp.net la configuration.Cela a abouti à la ligne suivante est ajoutée sur le web.config:

<system.web>
  <roleManager enabled="true" />
</system.web>

À partir de ce moment, l'application est en supposant que je faisais des rôles par le biais de la Asp.net gestionnaire du site, et non pas à travers FormsAuthentication rôles.Ainsi, les échecs répétés, malgré le fait que l'authentification et les rôles de la logique a été mis en place correctement.

Après cette ligne a été supprimée à partir du web.config tout a fonctionné parfaitement.

Autres conseils

c'est juste un random shot, mais êtes-vous bloqué en raison de l'ordre de l'autorisation de l'Admin?Peut-être que vous devriez essayer de passer votre nier tous et de toutes vos Admin.

Juste au cas où il se fait écrasé par le nier.

(J'ai eu des exemples de code ici, mais ils n'étaient pas en train d'apparaître.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top