2009-03-12 11 views
5

Esiste un modo valido per combinare l'autenticazione di Windows ASP.NET con un oggetto IPrincipal/IIdentity personalizzato? Ho bisogno di memorizzare l'indirizzo e-mail dell'utente e l'ho fatto per l'autenticazione basata su form utilizzando una coppia personalizzata IIdentity/IPrincipal che ho aggiunto al Context.CurrentUser durante l'evento AuthenticateRequest.IPrincipal personalizzato insieme a WindowsAuthentication

Come passare al meglio con WindowsAuthentication?

risposta

3

Forse potresti creare il tuo "ExtendedWindowsPrincipal" come una classe derivata basata su WindowsPrincipal e aggiungere semplicemente i dati extra alla classe derivata?

In questo modo, ExtendedWindowsPrincipal verrà comunque riconosciuto ovunque sia necessario un WindowsPricinpal.

OPPURE: dal momento che si sta utilizzando l'autenticazione di Windows, si è probabilmente in una rete Windows: c'è una directory attiva o un database utente da qualche parte, dove è possibile cercare il proprio indirizzo e-mail che si è interessato invece di conservarlo nel preside?

Marc

+0

creazione di una classe derivata stata una mia idea, ma sono sicuro su se è consigliabile sostituire l'IPrincipal e come è fatto correttamente Ho intenzione di cercare l'indirizzo email dalla directory, ma la mia idea era di raccogliere tutte le informazioni dell'utente in un posto, proprio come ho fatto io w. autenticazione personalizzata. – PHeiberg

+0

Non vedo alcun problema a sostituire WindowsPrincipal con il proprio ExtendedWindowsPrincipal, se si tratta di una classe derivata. Dopo tutto, è ancora un WindowsPrincipal - con alcune cose aggiunte. Per farlo, indago su global.asax e Application_AuthenticateRequest. –

+0

Ho avuto problemi con il tentativo di far funzionare IsInRole e non volevo investire tempo in IPrincipal, quindi ho finito col mettere il resto delle informazioni utente negli elementi di contesto. Grazie per l'aiuto. – PHeiberg

3

ho finito per il refactoring mia soluzione iniziale in sostituzione del principale al posto del Identità come ho inizialmente pensato. La sostituzione dell'identità si è rivelata problematica, poiché ho riscontrato problemi di sicurezza durante la creazione di un'istanza di un nuovo WindowsPrincipal esteso.

public class ExtendedWindowsPrincipal : WindowsPrincipal 
{ 
    private readonly string _email; 

    public ExtendedWindowsPrincipal(WindowsIdentity ntIdentity, 
     string email) : base(ntIdentity) 
    { 
      _email = email; 
    } 

    public string Email 
    { 
     get { return _email; } 
    } 
} 

Nel mio modulo di autenticazione ho sostituito il principale dello HttpContext in questo modo:

var currentUser = (WindowsIdentity)HttpContext.Current.User.Identity; 
HttpContext.Current.User = 
    new ExtendedWindowsPrincipal(currentUser, userEmail); 
+0

grazie per il post, ho battuto la testa per un paio d'ore. Ho incontrato gli stessi problemi di sicurezza ... wtf! destra? La tua soluzione funziona, grazie mille! –

Problemi correlati