2011-09-05 25 views
5

Udało mi się zintegrować logowanie jednokrotne z WIF na mojej dwóch domenach internetowych. Teraz mam wymóg, aby niektórzy użytkownicy logowali się przy użyciu SSO, a inni użytkownicy nie używają SSO. Jak mogę to osiągnąć?Pojedyncze logowanie z WIF

będę wdzięczny za pomoc,

Dzięki

Shahram Javed

+0

Czy możesz być bardziej konkretny? trudno jest udzielić odpowiedzi z takim poziomem szczegółowości. –

+0

Więcej szczegółów, np. Jak teraz logują się użytkownicy? Jak chcesz podzielić loginy? Czy to jest aktywne czy pasywne? – nzpcmad

Odpowiedz

12

Twoje pytanie jest trochę niejasne, więc może to nie jest prawidłowa odpowiedź. Opowiem o naszej historii (z której Eugenio pomógł) z nadzieją, że pomoże OP lub komuś innemu. Interpretuję "nie dla innego użytkownika", ponieważ niektórzy użytkownicy nie używają SSO: prawdopodobnie używają uwierzytelniania formularzy lub czegoś innego.

Używamy WIF do SSO w aplikacji internetowej, która obsługuje również uwierzytelnianie formularzy w wersji implementowanej przez WIF.

Jeśli ktoś wejdzie na stronę Zaloguj się i poda nazwę użytkownika i hasło, użyjemy WIF do ustawienia autoodpowiedzi ClaimsPrincipal. Zasadniczo witryna dostarcza roszczeń do siebie. Uwierzytelnianie federacyjne jest używane w taki sam sposób, w jaki normalnie FormsAuthentication jest: ustaw plik cookie przy użyciu metody statycznej w usłudze FederatedAuthentication. Trochę inaczej, ale w zasadzie ta sama zasada.

var token = FederatedAuthentication.SessionAuthenticationModule 
    .CreateSessionSecurityToken(claimsPrincipal, "MyApp.Token", 
    DateTime.UtcNow, DateTime.UtcNow.AddDays(7), false); 
FederatedAuthentication.SessionAuthenticationModule 
    .AuthenticateSessionSecurityToken(token, true); 

Nasza aplikacja internetowa wykorzystuje jednego zaufanego dostawcę (serwer ADFS negocjujący z N partnerami stowarzyszonymi). Potrzebujemy niestandardowego sposobu, aby zdecydować, czy przekierowywać nieuwierzytelnionych użytkowników do strony logowania, czy do ADFS dla użytkowników jednokrotnego logowania. Wyłączamy pasywne przekierowanie, więc WIF nie wysyła automatycznie ludzi do ADFS.

<wsFederation passiveRedirectEnabled="false" 
    issuer="https://adfs.ourplace.com/adfs/ls/" 
    realm="http://www.ourplace.com" .../> 

Stąd używamy atrybutu uwierzytelnienia (używamy ASP.NET MVC, ale to, co jest dla Ciebie odpowiednie).

public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.User.Identity.IsAuthenticated) 
      return; // all good 

     RedirectTo(IsSSO() ? GetADFSUrl() : GetSignInUrl(); 
    } 
} 

Aby zdecydować, czy użytkownik jest użytkownikiem SSO lub nie, gdy są Nieuwierzytelniona jest problem Discovery Home Realm. Różni ludzie rozwiązują to inaczej. Dla nas, gdy użytkownik SSO po raz pierwszy łączy się z systemem za pomocą SSO, umieszczamy trwały plik cookie w jego domenie (która jest identyfikatorem dostawcy roszczeń w programie ADFS). Jeśli plik cookie jest nieobecny, przechodzi do logowania. Jeśli plik cookie jest obecny, zostanie przekierowany do programu ADFS. URL jest:

var adfsEntryPoint = FederatedAuthentication.WSFederationAuthenticationModule.Issuer; 
var wtRealm = FederatedAuthentication.WSFederationAuthenticationModule.Realm; 
var whr = <from home realm cookie> 
var redirectUrl = string.Format("{0}?wa=wsignin1.0&wtrealm={1}&whr={2}", 
    adfsEntryPoint, 
HttpContext.Server.UrlEncode(wtRealm), 
HttpContext.Server.UrlEncode(whr)); 

Jeżeli przekierowanie bezpośrednio do n stowarzyszonych partnerów, może przechowywać token odnowienie URL w pliku cookie.

Powiązane problemy