2010-04-12 9 views
23

Czy są jakieś przyzwoite przykłady następujących danych:ASP.NET MVC 2 i uwierzytelnianie przy użyciu WIF systemu Windows Identity Foundation()

pominie the WIF SDK, istnieją przykłady przy użyciu WIF w połączeniu z użyciem ASP.NET WSFederationAuthenticationModule (FAM), aby przekierować do strony ASP.NET cienką skórkę na usługę bezpiecznego tokena (STS), której używa użytkownik do uwierzytelnienia (poprzez podanie nazwy użytkownika i hasła).

Jeśli dobrze rozumiem WIF i dostęp oparty na roszczeniach, chciałbym, aby moja aplikacja dostarczyła własny ekran logowania, na którym użytkownicy podali swoją nazwę użytkownika i hasło, i pozwolili temu delegować do STS w celu uwierzytelnienia, wysyłając dane logowania do punktu końcowego poprzez standard bezpieczeństwa (WS- *) i oczekiwanie na token SAML. Idealnie, SessionAuthenticationModule działałby zgodnie z przykładami przy użyciu FAM w połączeniu z SessionAuthenticationModule, tj. Był odpowiedzialny za odtworzenie IClaimsPrincipal z pliku cookie z sesją bezpieczeństwa i przekierowanie na moją stronę logowania do aplikacji, gdy wygasła sesja bezpieczeństwa.

Czy to, co opisuję, możliwe jest przy użyciu FAM i SessionAuthenticationModule z odpowiednimi ustawieniami web.config, czy też muszę sam sobie pomyśleć o napisaniu HttpModule, aby sobie z tym poradzić? Czy możliwe jest przekierowanie do cienkiej witryny internetowej STS, w której użytkownicy logują się w trybie faktycznym w scenariuszu pasywnego wnioskodawcy?

Odpowiedz

19

Przykładem WIF + MVC jest dostępna w tym rozdziale „Identity Claims Guide”:

http://msdn.microsoft.com/en-us/library/ff359105.aspx

ja sugeruję przeczytaniu kilku pierwszych rozdziałów, aby zrozumieć wszystkie zasady leżące u podstaw. Ten blogu obejmuje specyfikę MVC + WIF:

http://blogs.msdn.com/b/eugeniop/archive/2010/04/03/wif-and-mvc-how-it-works.aspx

Kontrolowanie doświadczenie logowania jest idealnie czysty. Powinieneś po prostu wdrożyć swój własny STS (w swojej domenie, z twoim wyglądem, itp.). Twoje aplikacje będą po prostu polegać na AuthN (dlatego zazwyczaj nazywa się ją "stroną ufającą").

Zaletą architektury jest to, że autoryzacja jest delegowana do 1 komponentu (STS) i nie jest rozłożona na wiele aplikacji. Ale inną (ogromną) zaletą jest to, że można bardzo łatwo włączyć bardziej wyrafinowane scenariusze. Na przykład możesz teraz stowarzyszyć się z dostawcami tożsamości innych organizacji.

Hope it pomaga Eugenia

@RisingStar:

Znacznik (zawierający wierzytelności) mogą ewentualnie być kodowane (w przeciwnym razie będą one w postaci zwykłego tekstu). Właśnie dlatego SSL jest zawsze zalecany do interakcji między przeglądarką a STS.

Należy zauważyć, że nawet jeśli są one w tekście czystym, manipulowanie nie jest możliwe, ponieważ token jest podpisany cyfrowo.

+0

dzięki Eugenio, pomyślałem, że przeczytałem Przewodnik po Tożsamościach, oczywiście nie dlatego, że przegapiłem, że Fabrikam był aplikacją MVC. Na pewno jeszcze raz to obejrzę. Spojrzałem też na bloga Dominika Baiera i sądzę, że to, do czego dążę, to dzwonienie do aktywnego sts z serwera WWW na stronie logowania. –

+0

Nie widzę, że przy użyciu WIF w ASP.net MVC jest inny niż przy użyciu formularzy ASP.net. –

+1

Zasady są dokładnie takie same. Jest tylko kilka szczegółów dotyczących implementacji. Najczęściej występujące różnice to: -W aplikacji do obsługi formularzy internetowych zwykle używasz WIF do wymiany wszystkich protokołów (passiveRedirectEnable = true). W aplikacji MVC wyłączysz to i zajmiesz się tym programowo, jak wyjaśniono w moim poście na blogu. - W aplikacji MVC zazwyczaj stosuje się atrybut IAuthorizationFilter. W formularzach sieci Web to nie istnieje i po prostu polegasz na istniejącym mechanizmie autoryzacji ASP.NET (lub wywołaj IsInRole, itp.). –

13

To interesujące pytanie, które zadałeś. Wiem, że z jakiegoś powodu Microsoft wydał tę strukturę "Windows Identity Foundation" bez dużej dokumentacji. Wiem o tym, ponieważ miałem zadanie dowiedzieć się, jak z niego korzystać w nowym projekcie i zintegrować go z istniejącą infrastrukturą. Przez wiele miesięcy szukałem w sieci informacji, szukając dobrych informacji.

Podjąłem nieco inny punkt widzenia, aby rozwiązać problem, który opisujesz.

Wziąłem istniejącą aplikację logującą i zintegrowałem z nią WIFI Microsoftu. Rozumiem przez to, że mam aplikację, w której loguje się użytkownik. Aplikacja logująca przesyła poświadczenia dostarczone przez użytkownika do innego serwera, który zwraca tożsamość użytkownika (lub wskazuje na niepowodzenie podczas logowania).

Patrząc na niektóre z przykładów Microsoftu, widzę, że robią, co następuje: Narysuj SignInRequestMessage z kwerendy (generowanego przez powołując aplikacji Strony), skonstruować token usługi z klasy niestandardowej, a wreszcie zadzwonić FederatedSecurityTokenServiceOperations. ProcessSignInresponse z bieżącym httpcontext.response. Niestety, nie potrafię tego dobrze wyjaśnić; naprawdę musisz spojrzeć na próbki kodu.

Niektóre z moich kodów są bardzo podobne do próbki kodu. Tam, gdzie będziesz zainteresowany implementacją wielu własnych logik, jest GetOutputClaimsIdentity. Jest to funkcja, która tworzy tożsamość roszczeń opisującą zalogowanego użytkownika.

Oto, co myślę, że naprawdę chcesz wiedzieć. Tego Microsoft nie mówi w swojej dokumentacji, AFAIK.

Po zalogowaniu użytkownik zostaje przekierowany z powrotem do aplikacji strony ufającej. Bez względu na to, jak działa aplikacja do logowania, klasy WIF wyślą odpowiedź do przeglądarki użytkownika, która zawiera "ukryte" dane wejściowe HTML zawierające certyfikat podpisania tokena i roszczenia użytkownika. (Zgłoszenia będą w jasnym tekście). Na końcu tej odpowiedzi znajduje się przekierowanie do strony sieci zaufania.Wiem tylko o tej akcji, ponieważ złapałem ją za pomocą "Fiddlera"

Po powrocie na stronę strony ufającej, klasy WIF obsłużą odpowiedź (przed uruchomieniem jakiegokolwiek kodu). Certyfikat zostanie zatwierdzony. Domyślnie, jeśli skonfigurowałeś stronę internetową strony zależnej za pomocą FedUtil.exe (klikając "Dodaj STS Reference w aplikacji strony ufającej od Visual Studio), klasa Microsoft zweryfikuje odcisk kciuka certyfikatu."

Wreszcie, WIF framework ustawia pliki cookie w przeglądarce użytkownika (Z doświadczenia wiem, że nazwy ciasteczek zaczynają się od "FedAuth"), które zawierają roszczenia użytkowników.Te ciasteczka nie nadają się do odczytu przez człowieka

Kiedy to się stanie, możesz opcjonalnie wykonać operacje na roszczenia użytkownika na stronie internetowej strony ufającej za pomocą ClaimsAuthenticationClass. To jest, gdzie Twój kod jest ponownie uruchomiony

Wiem, że różni się to od tego, co opisujesz, ale mam tę konfigurację działa. Mam nadzieję, że to pomoże!

ps. Sprawdź inne pytania, które zadawałem o systemie Windows Identity Foundation.

UPDATE: Aby odpowiedzieć na pytanie w komentarzu poniżej:

jedna rzecz, którą zostawiłem na to, że przekierowanie do STS logowania aplikacja dzieje na zasadzie przekierowania z zapytaniem-string zawierający adres URL aplikacja, do której loguje się użytkownik. To przekierowanie dzieje się automatycznie, gdy użytkownik po raz pierwszy próbuje uzyskać dostęp do strony wymagającej uwierzytelnienia. Ewentualnie uważam, że można przekierować ręcznie za pomocą modułu WSFederationAuthentication.

Nigdy nie próbowałem tego robić, ale jeśli chcesz używać na stronie logowania w samej aplikacji, uważam, że ramy te powinny umożliwić korzystanie z następujących czynności:

1) enkapsulacja STS kod w bibliotece. 2) Odwołaj bibliotekę do swojej aplikacji. 3) Utwórz stronę logowania w aplikacji. Upewnij się, że taka strona nie wymaga uwierzytelnienia. 4) Ustaw właściwość wystawcy elementu wsFederation w sekcji Microsoft.IdentityModel pliku web.config na stronie logowania.

+0

Dziękuję za poświęcenie czasu na udzielenie odpowiedzi na moje pytanie. Przejrzałem skompilowany plik pomocy html dostarczany z pakietem SDK WIF, a także przejrzałem wszystkie przykłady. Wybrałem 'FAM' i 'SessionAuthenticationModule' z Reflectorem i myślę, że mam dobrą obsługę tego, jak działa, ale byłem zainteresowany, aby zobaczyć, czy istnieją przykłady używając' FAM' lub może niestandardowego HttpModule w połączeniu z 'SessionAuthenticationModule' dla tożsamości opartej na roszczeniach. FAM wydaje się być łatwy w użyciu, ale nie zapewnia dużej elastyczności ... –

+1

Być może cały pomysł polega na tym, że logowanie powinno odbywać się w aplikacji internetowej STS, ponieważ oznacza to, że nie musisz się martwić o budowanie ekranu logowania w każdej z aplikacji internetowych. Chciałbym jednak zachować określony wygląd i styl ekranu logowania dla każdej aplikacji i najlepiej przechowywać go w tej samej domenie, aby nie mylić użytkowników (co może się zdarzyć, ponieważ istnieje potencjalnie dużo doświadczeni technicy). Chcę tylko wprowadzić dane wejściowe, opakować je w wywołanie stowarzyszone w usłudze WS do STS w celu uwierzytelnienia. Czy moje myślenie jest niezgodne z ideą? –

+0

Twoje myślenie niekoniecznie jest źle ustawione. Zacząłem już od oddzielnej aplikacji logującej, która jest używana do innych aplikacji; Po prostu dodałem STS do aplikacji logującej się. Wierzę, że to, co chcesz zrobić, jest możliwe, ale będzie wymagało pewnych eksperymentów, aby je uruchomić. Zaktualizowałem moją odpowiedź z pomysłem, w jaki sposób można to wykonać. –

4

Co chcesz zrobić, to aktywny wpis. WIF zawiera WSTrustChannel(Factory), który pozwala ci komunikować się bezpośrednio ze STS i uzyskać token bezpieczeństwa. Jeśli chcesz, aby twój formularz logowania działał w ten sposób, możesz wykonać próbkę "WSTrustChannel" z zestawu SDK WIF 4.0. Po otrzymaniu tokena, następujący kod odbędzie że żeton i wywołać WIF obsługi do utworzenia sesji tokena i ustawić odpowiedni plik cookie:

public void EstablishAuthSession(GenericXmlSecurityToken genericToken) 
{ 
    var handlers = FederatedAuthentication.ServiceConfiguration.SecurityTokenHandlers;    
    var token = handlers.ReadToken(new XmlTextReader(
             new StringReader(genericToken.TokenXml.OuterXml))); 

    var identity = handlers.ValidateToken(token).First(); 
    // create session token 
    var sessionToken = new SessionSecurityToken(
     ClaimsPrincipal.CreateFromIdentity(identity)); 
    FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionToken); 
} 

Gdy już to zrobisz, witryna powinna zachowywać się tak samo jak gdyby miało miejsce bierne podpisanie.

1

Można użyć kontroli FederatedPassiveSignIn.

+0

To jest kontrola po stronie serwera, która działa dobrze w przypadku formularzy sieciowych, ale oczywiście nie pasuje do aplikacji MVC (ponieważ jest to kontrola po stronie serwera z runat = "server"). Wszelkie sugestie na ten temat? – atconway

0

Ustawienie pliku cookie w następujący sposób: FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie (sessionToken); Nie można pracować z SSO w innych domenach.

Do plików cookie powinien być ustawiony przez STS, a nie RP.

Powiązane problemy