2011-09-05 3 views
5

J'ai réussi à intégrer SSO avec WIF sur mes deux Web Domain. Maintenant, j'ai une exigence que certains utilisateurs se connectent en utilisant SSO et d'autres utilisateurs n'utilisent pas SSO. Comment je peux réaliser cette chose?Connexion unique avec WIF

Je vous serais reconnaissant de votre aide,

Merci

Shahram Javed

+0

Pouvez-vous être plus précis? difficile de fournir une réponse avec ce niveau de détails. –

+0

Plus de détails, par ex. Comment les utilisateurs se connectent-ils maintenant? Comment aimeriez-vous diviser les ouvertures de session? Est-ce actif ou passif? – nzpcmad

Répondre

12

Votre question est un peu vague alors peut-être ce n'est pas la bonne réponse. Permettez-moi de raconter notre histoire (à laquelle Eugenio a contribué) avec l'espoir qu'elle aide le PO ou quelqu'un d'autre. J'interprète «pas pour l'autre utilisateur» car certains utilisateurs n'utilisent pas l'authentification unique: ils utilisent vraisemblablement l'authentification par formulaire ou quelque chose de différent.

Nous utilisons WIF pour SSO dans une application Web qui prend également en charge une version wif de l'authentification par formulaires.

Si quelqu'un accède à la page de connexion et fournit un nom d'utilisateur et un mot de passe, nous utilisons WIF pour définir un ClaimsPrincipal auto-émis. Essentiellement, le site Web fournit des revendications à lui-même. FederatedAuthentication est utilisé de la même manière que FormsAuthentication est normalement: définir un cookie à l'aide d'une méthode statique sur FederatedAuthentication. Bit différent, mais fondamentalement le même principal.

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

Notre application Web utilise un seul fournisseur de confiance (un serveur ADFS qui négocie avec les partenaires fédérés N). Nous avons besoin d'une méthode personnalisée pour décider de rediriger les utilisateurs non authentifiés vers la page Connexion ou vers ADFS pour les utilisateurs SSO. Nous désactivons la redirection passive afin que WIF n'envoie pas automatiquement les utilisateurs à ADFS. De là, nous utilisons un attribut d'authentification (nous utilisons ASP.NET MVC mais tout ce qui est approprié pour vous).

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

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

Pour décider si l'utilisateur est un utilisateur SSO ou non quand ils sont non authentifié est la maison Realm problème de découverte. Différentes personnes le résolvent différemment. Pour nous, lorsqu'un utilisateur SSO se connecte pour la première fois au système à l'aide de l'authentification unique, nous établissons un cookie persistant avec son domaine d'origine (qui est l'identificateur du fournisseur de revendications dans ADFS). Si le cookie est absent, ils vont se connecter. Si le cookie est présent, ils sont redirigés vers ADFS. L'URL est:

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 vous redirigez directement à N partenaires fédérés, peut-être stocker l'URL de renouvellement jeton dans le cookie.