2009-11-13 17 views
2

J'ai un fournisseur de rôle personnalisé qui obtient les rôles auxquels un utilisateur appartient à partir d'une base de données. J'ai également un module d'authentification personnalisé enregistré dans httpModules de mon web.config qui renifle les demandes HTTP entrantes et (si c'est une demande signée OAuth) définit la propriété HttpContext.Current.User pour emprunter l'identité de l'utilisateur, et l'IPrincipal qu'il définit inclut tous les rôles de l'utilisateur, plus un supplémentaire appelé "délégué". Le problème est que, après avoir défini mon IPrincipal personnalisé, ASP.NET appelle toujours mon fournisseur de rôles personnalisé, puis réinitialise IPrincipal avec celui qui a uniquement les rôles standard pour cet utilisateur.Comment empêcher RoleProvider de remplacer des rôles personnalisés?

Si je mets <roleManager enabled="false" ...> dans mon fichier web.config, les rôles assignés du module d'authentification restent. Évidemment, je veux le meilleur des deux mondes. Comment puis-je utiliser le fournisseur de rôle, mais "annuler" l'effet du fournisseur de rôle lorsque mon module d'authentification décide de le faire?

Répondre

1

Il se trouve que dans la méthode du module d'authentification http Init, je peux trouver le RoleManager, puis accrocher un événement qui me donne le pouvoir de veto si elle fait son travail primordial:

public void Init(HttpApplication context) { 
     var roleManager = (RoleManagerModule)context.Modules["RoleManager"]; 
     roleManager.GetRoles += this.roleManager_GetRoles; 
    } 

    private void roleManager_GetRoles(object sender, RoleManagerEventArgs e) { 
     if (this.application.User is OAuthPrincipal) { 
      e.RolesPopulated = true; // allows roles set in AuthenticationRequest to stick. 
     } 
    } 

    private void context_AuthenticateRequest(object sender, EventArgs e) { 
     if (/*oauth request*/) { 
      HttpContext.Current.User = CreateOAuthPrincipal(); 
     } 
    }