2009-03-12 8 views
5

Czy istnieje jakiś dobry sposób na połączenie uwierzytelniania Windows ASP.NET z niestandardowym obiektem IPrincipal/IIdentity? Muszę przechowywać adres e-mail użytkownika i zrobić to dla uwierzytelniania za pomocą niestandardowej pary IIdentity/IPrincipal dodanej do Context.CurrentUser podczas zdarzenia AuthenticateRequest.Niestandardowe IPrincipal wraz z WindowsAuthentication

Jak najlepiej wykonać to, korzystając z uwierzytelniania systemu Windows?

Odpowiedz

3

Może mógłbyś utworzyć "ExtendedWindowsPrincipal" jako klasę pochodną opartą na WindowsPrincipal i po prostu dodać swoje dodatkowe dane do klasy pochodnej?

W ten sposób system ExtendedWindowsPrincipal nadal będzie rozpoznawany wszędzie tam, gdzie jest potrzebny program WindowsPricinpal.

LUB: ponieważ mówisz o używaniu uwierzytelniania systemu Windows, prawdopodobnie jesteś w sieci Windows - czy istnieje gdzieś Active Directory lub baza danych użytkowników, gdzie możesz sprawdzić swój adres e-mail, zainteresowany zamiast przechowywać go w dyrektorze?

Marc

+0

Tworzenie klasy pochodnej był mój pomysł, ale jestem pewny, czy to mądre, aby zastąpić IPrincipal i jak to jest zrobione poprawnie. Zamierzam wyszukać adres e-mail z katalogu, ale moim pomysłem było zebranie wszystkich informacji o użytkowniku w jednym miejscu, tak jak zrobiłem to w. niestandardowe uwierzytelnianie. – PHeiberg

+0

Nie widzę problemu z zastępowaniem WindowsPrincipal przez własną wersję ExtendedWindowsPrincipal, jeśli jest to klasa pochodna. W końcu to wciąż WindowsPrincipal - z dodatkowymi dodatkami. Aby to zrobić, chciałbym zbadać global.asax i Application_AuthenticateRequest. –

+0

Mam problemy z próbą uzyskania IsInRole, aby nadal działał i nie chciałem zainwestować czasu w używanie IPrincipal, więc skończyłem umieszczając resztę informacji o użytkowniku w elementach kontekstowych. Dzięki za pomoc. – PHeiberg

3

skończyło się refactoring moje pierwsze rozwiązanie do zastąpienia Principal zamiast Tożsamości jak pierwotnie sądzono. Zastąpienie tożsamości okazało się kłopotliwe, ponieważ napotkałem problemy bezpieczeństwa podczas tworzenia instancji nowego rozszerzonego WindowsPrincipal.

public class ExtendedWindowsPrincipal : WindowsPrincipal 
{ 
    private readonly string _email; 

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

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

W moim modułem Authentication Wymieniłem kapitał na HttpContext tak:

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

dzięki za pocztę, walić mi w głowę już od kilku godzin. Przeszedł na te same problemy bezpieczeństwa ... wtf! dobrze? Twoje rozwiązanie działa, wielkie dzięki! –