2011-09-05 18 views
5

He integrado correctamente SSO con WIF en mis dos dominios web. Ahora tengo el requisito de que algunos usuarios inicien sesión usando SSO y otros usuarios no usan SSO. ¿Cómo puedo lograr esto?Inicio de sesión único con WIF

le agradecería su ayuda,

Gracias

Shahram Javed

+0

¿Puede ser más específico? Es difícil dar una respuesta con este nivel de detalles. –

+0

Más detalles, por ejemplo, por ej. ¿Cómo inician sesión los usuarios ahora? ¿Cómo le gustaría dividir los inicios de sesión? ¿Esto es activo o pasivo? – nzpcmad

Respuesta

12

su pregunta es un poco vago así que tal vez esta no es la respuesta correcta. Permítanme relatar nuestra historia (con lo que Eugenio ayudó) con la esperanza de que ayude al OP u otra persona. Estoy interpretando "no para otro usuario", ya que algunos usuarios no usan SSO: presumiblemente usan autenticación de formularios o algo diferente.

Usamos WIF para SSO en una aplicación web que también admite una versión implementada wif de autenticación de formularios.

Si alguien llega a la página Iniciar sesión y proporciona un nombre de usuario y una contraseña, usamos WIF para establecer un ClaimsPrincipal autoemitido. Esencialmente, el sitio web se está proporcionando reclamos a sí mismo. FederatedAuthentication se usa de la misma manera que normalmente funciona FormsAuthentication: establece una cookie con un método estático en FederatedAuthentication. Un poco diferente, pero básicamente el mismo principal.

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

Nuestra aplicación web utiliza un solo proveedor de confianza (un servidor ADFS que negocia con N socios federados). Necesitamos una forma personalizada de decidir si redirigir a los usuarios no autenticados a la página de inicio de sesión o a ADFS para los usuarios de SSO. Deshabilitamos la redirección pasiva para que WIF no envíe personas automáticamente a ADFS.

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

A partir de aquí utilizamos un atributo de autenticación (utilizamos ASP.NET MVC, pero lo que sea apropiado para usted).

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

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

para decidir si el usuario es un usuario de SSO o no cuando son no autenticado es el problema Discovery Home Reino. Diferentes personas lo resuelven de manera diferente. Para nosotros, cuando un usuario de SSO se conecta por primera vez al sistema utilizando SSO establecemos una cookie persistente con su dominio de origen (que es el Identificador de Proveedor de Reclamos en ADFS). Si la cookie está ausente, van a Iniciar sesión. Si la cookie está presente, se redirigen a ADFS. La URL es:

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)); 

Si redirige directamente a N socios federados, quizá almacenar la URL de renovación simbólica en la cookie.

Cuestiones relacionadas