2009-03-24 8 views
1

J'utilise le fournisseur d'appartenance dans ASP.NET MVC et, pour la plupart des accès aux données, j'utilise nHibernate et un modèle de référentiel. Recommandez-vous d'utiliser une façade sur le fournisseur d'appartenance pour que je puisse créer un référentiel et le faire fonctionner un peu plus en ligne avec le reste de mon modèle d'entité? J'ai également ajouté des fonctionnalités supplémentaires comme la possibilité d'ajouter des fonctions à un rôle et la création de la façade rendrait les classes un peu plus agréable.Création d'un fournisseur de facade sur l'appartenance

Qu'ont fait d'autres personnes avec le fournisseur d'adhésion?

+0

Il n'y a pas de modèle de fournisseur de rôles dans MVC? –

+0

Connexe: http://stackoverflow.com/questions/512922/how-do-you-handle-membership-roles-when-using-nhibernate – Cherian

Répondre

0

J'ai résolu ce problème. De la manière suivante:

web.config:

<authentication mode="Forms"> 
    <forms name="APPAUTH" 
     defaultUrl="/webapp/Home.mvc" 
     loginUrl="/webapp/Session.mvc/Login" 
     protection="All" 
     timeout="30" 
     path="/"/> 
</authentication> 
<authorization> 
    <deny users="?"/> 
</authorization> 

<location path="Session"> 
    <system.web> 
    <authorization> 
     <allow users="*"/> 
    </authorization> 
    </system.web> 
</location> 

Je crochet Application_AuthenticateRequest quelque chose le long des lignes de:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
{ 
    string cookieName = FormsAuthentication.FormsCookieName; 
    HttpCookie authCookie = Context.Request.Cookies[cookieName]; 

    if (null == authCookie) 
    { 
     //no authentication cokie present 
     return; 
    } 

    FormsAuthenticationTicket authTicket = null; 
    try 
    { 
     authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
    } 
    catch (Exception) 
    { 
     // Can't do anything if we can't decrypt the ticket so treat it as not there 
     FormsAuthentication.SignOut(); // Remove bad ticket 
    } 

    if (authTicket == null) 
    { 
     //could not decrypt cookie 
     return; 
    } 

    // get the role 
    string[] roles = authTicket.UserData.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries); 

    // Set the security context 
    ISecurityService security = ContainerProvider.RequestContainer.Resolve<ISecurityService>(); 
    Models.User user = security.GetUser(authTicket.Name); 

    if (user == null) 
    { 
     FormsAuthentication.SignOut(); 
     throw new HttpException((int)System.Net.HttpStatusCode.Unauthorized, "Session expired!"); 
    } 

    AppIdentity id = new AppIdentity(user, !authTicket.Expired); 
    AppPrincipal principal = new AppPrincipal(id, roles); 

    Context.User = principal; 
} 

L'appel ContainerProvider.RequestContainer.Resolve<ISecurityService>(); est à un conteneur Autofac, mais vous pouvez faire tout ce que vous besoin de/vouloir ici.

Les classes AppIdentity et sont personnalisées, donc je peux accéder à mes rôles, mais ils ne sont pas si compliqués.

0

Vous pouvez implémenter votre propre MembershipProvider pour le site, en héritant de la classe de base MembershipProvider. Remplacez simplement les méthodes dont vous avez besoin pour accéder aux données via nHibernate.

La seule fonction que vous devez réellement implémenter est ValidateUser. Le reste dépend de la fonctionnalité que vous utilisez dans le site relatif à MembershipProvider.

Questions connexes