2011-08-21 25 views
13

Questo dovrebbe essere semplice, ma semplicemente non riesco a capirlo dopo tutto il mio googling. Ecco cosa voglio. Ho una tabella utenti personalizzata (senza ruoli al momento) che mi piacerebbe autorizzare contro. Per questo dovrò implementare un Personal Membership Provider che ho già fatto. La mia domanda è però, come faccio a impostare un IPrincipal personalizzato su HttpContext.Current.User? Dove dovrebbe accadere? Diciamo che ho la seguente configurazione:IPrincipale personalizzato con autenticazione moduli in ASP.NET MVC

public class CustomMembershipProvider : MembershipProvider 
{ 
    private IUserRepository _repository; 

    public CustomMembershipProvider(IUserRepository repository) 
    { 
     _repository = repository; 
    } 

    public override bool ValidateUser(string username, string password) 
    { 
     //check user repository 
    } 

    //additional methods omitted for brevity 
} 

Ho poi avere una classe utente personalizzata gli attrezzi IPrincipal e IIdentity

public class CustomUser : IPrincipal 
    { 
     public CustomUser(string name, int userId, string additionalInfo) 
     { 
      Identity = new CustomIdentity(name, userId, additionalInfo); 
     } 

     public IIdentity Identity { get; private set; } 

     public bool IsInRole(string role) 
     { 
      return true; 
     } 
    } 

    public class CustomIdentity : IIdentity 
    { 
     public CustomIdentity(string name, int userId, string additionalInfo) 
     { 
      Name = name; 
      UserId = userId; 
      AdditionalInfo = additionalInfo; 
     } 

     public string Name { get; private set; } 

     public string AuthenticationType 
     { 
      get { return "CustomAuth"; } 
     } 

     public bool IsAuthenticated 
     { 
      get { return !String.IsNullOrEmpty(Name); } 
     } 

     public int UserId { get; private set; } 
     public string AdditionalInfo { get; private set; } 
    } 

Quindi la mia domanda è, dove è il posto giusto per impostare il Context.User a un'istanza di questo utente personalizzato? Ho bisogno di un attributo di autorizzazione personalizzato? Se sì, come sarebbe?

+0

Come è andata avanti con questo alla fine? Sono agli inizi di fare qualcosa di simile a me stesso. – ETFairfax

+0

Sono sulla stessa barca, sono quasi pronto per creare un metodo di estensione per fare il lavoro! –

risposta

2

Io suggerisco di usare una classe base di controllo personalizzato per tutti i controller

Poi, nel OnAuthorization, chiamare

protected override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext) 
{ 
    // Actual Authentication 
    HttpContext.User = user; 
    Thread.CurrentPrincipal = user; 
    base.OnAuthorization(filterContext); 
} 

io non sono del tutto sicuro di come richiamare il provider di appartenenze perché sto facendo Manuallt, ma penso che tu abbia accesso statico a Membership.Provider per eseguire la costruzione dell'oggetto reale.

Ho bisogno di un attributo di autorizzazione personalizzato?

n notare la differenza di autenticazione e autorizzazione: l'autenticazione stabilisce l'identità dell'utente nel sistema. L'autorizzazione consente o rifiuta una richiesta specifica. Quindi, AuthorizeAttribute ha anche un parametro Roles per consentire a un'azione di essere chiamata solo da determinati utenti.

+0

Non sono sicuro di aver capito la tua risposta. Quando dici Autenticazione reale, stai parlando di impostare effettivamente AuthCookie lì? Che cosa farebbe allora il modulo Loing in post? – BFree

+0

Nel modo in cui comprendo il MembershipProvider, ValidateUser non dovrebbe essere chiamato molto spesso - non appena l'utente effettua il login, riceve un cookie di autenticazione che verrà utilizzato da quel momento in poi. Tuttavia, per ottenere l'oggetto utente dovrai colpire il database (o qualche cache). Ma questo è un requisito del tuo codice. Penso che il MembershipProvider non sia molto ben progettato, farlo manualmente ha molti vantaggi. – mnemosyn

+0

Ora hai cambiato il tuo commento mentre stavo scrivendo il mio :) "OnAuthorization' sarà chiamato per ogni richiesta, anche se l'utente è già (forms-) autenticato; Stai colpendo il DB solo per recuperare l'oggetto utente. – mnemosyn

Problemi correlati