2009-12-15 9 views
2

J'utilise plusieurs fournisseurs de rôles, le fournisseur SQL standard plus un fournisseur personnalisé. Inside Global.asax - RoleManager_GetRoles Je crée un RolePrincipal pour les utilisateurs qui doivent utiliser mon fournisseur personnalisé avec le nom du fournisseur défini pour mon fournisseur personnalisé, et laisser les autres utilisateurs être traités comme d'habitude.Roles.GetRolesForUser appelle le fournisseur de rôle par défaut uniquement?

Cela fonctionne presque, asp.net permet d'accéder aux pages protégées via web.config et appelle mon fournisseur pour obtenir la liste des rôles. Cependant, lorsque j'appelle Roles.GetRolesForUser() dans mon code, il semble que j'appelle le fournisseur de rôle par défaut, pas mon fournisseur personnalisé. Si je définis mon fournisseur personnalisé comme étant la valeur par défaut, il est invoqué, mais seulement il est invoqué. J'ai travaillé autour d'elle en énumérant plutôt les fournisseurs de rôle et en appelant GetRolesForUser() sur le fournisseur avec un nom correspondant à RolePrincipal, mais il me semble que Roles.GetRolesForUser() devrait le faire par défaut.

Ai-je raté quelque chose?

Répondre

5

RoleManager et RolePrincipal sont des objets différents à des fins différentes. Je pense que ce que vous voulez utiliser est un appel à GetRoles() sur votre instance RolePrincipal, plutôt que Roles.GetRolesForUser(). La différence est que RolePrincipal explicite définit la relation entre un utilisateur et un fournisseur, alors que Roles est juste un objet de gestion pour les fournisseurs de rôles, et étant donné aucune autre information, utilisera simplement le fournisseur par défaut. De l'documentation for RolePrincipal:

L'objet RolePrincipal implémente l'interface IPrincipal et représente la sécurité actuelle contexte de la requête HTTP.

Lorsque la gestion des rôles est activée (voir rôles), le RoleManagerModule attribue un objet RolePrincipal à la propriété utilisateur du courant HttpContext.

La classe RolePrincipal expose l'identité de sécurité pour la requête HTTP en cours et effectue en outre contrôles d'adhésion de rôle. Si CacheRolesInCookie est vrai, alors l'objet RolePrincipal gère la liste mise en cache des rôles et recherche rôle adhésion pour l'utilisateur en cours dans la première liste en cache , le rôle fournisseur. Si CacheRolesInCookie est false, l'objet RolePrincipal recherche toujours l'appartenance au rôle à l'aide du fournisseur de rôle .

Espérons que ça aide.

+0

Cela a du sens et correspond au comportement que je vois. Malheureusement, je fais face à une grande quantité de code préexistant qui utilise Roles.GetRolesForUser(). Il est temps pour un ré-affacturage je suppose. Merci. – Eddie

+0

Pas de problème. Si vous obtenez des réponses qui vous aident, vous devriez vous sentir libre de les augmenter. ;) – womp