2010-04-12 19 views
23

Existe-t-il des exemples dignes de la disposition suivante:ASP.NET MVC 2 et l'authentification à l'aide WIF (Windows Identity Foundation)

Regarder par the WIF SDK, il y a des exemples d'utilisation WIF conjointement avec ASP.NET à l'aide le WSFederationAuthenticationModule (FAM) pour rediriger vers un site ASP.NET peau fine en plus d'un service de jeton de sécurité (STS) que l'utilisateur utilise pour s'authentifier (en fournissant un nom d'utilisateur et un mot de passe). Si je comprends correctement WIF et l'accès basé sur les revendications, je voudrais que mon application fournisse son propre écran de connexion où les utilisateurs fournissent leur nom d'utilisateur et mot de passe et le confient à un STS pour authentification, envoyant les informations de connexion à un point de terminaison via un standard de sécurité (WS- *) et en attendant qu'un jeton SAML soit renvoyé. Idéalement, le SessionAuthenticationModule fonctionnerait comme dans les exemples en utilisant FAM en conjonction avec SessionAuthenticationModule, c'est-à-dire en reconstruisant le IClaimsPrincipal du cookie fragmenté de sécurité de session et en le redirigeant vers ma page de connexion à l'application lorsque la session de sécurité expirera.

Est-ce que ce que je décris possible en utilisant FAM et SessionAuthenticationModule avec les paramètres web.config appropriés, ou dois-je penser à écrire un HttpModule moi-même pour gérer cela? Alternativement, redirige vers un STS de site web fin où les utilisateurs se connectent dans l'approche de facto dans un scénario de demandeur passif?

Répondre

19

Un exemple de WIF + MVC est disponible dans ce chapitre du « Guide des revendications d'identité »:

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

Je ne vous suggère de lire les premiers chapitres de couple pour comprendre tous les principes sous-jacents. Ce blog couvre les détails de MVC + WIF:

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

Contrôle de l'expérience de connexion est parfaitement bien. Vous devriez juste déployer votre propre STS (dans votre domaine, avec votre apparence &, etc.). Vos applications s'appuieraient simplement sur AuthN (c'est la raison pour laquelle une application est généralement appelée «partie de confiance»).

L'avantage de l'architecture est que authN est délégué à 1 composant (le STS) et n'est pas réparti dans de nombreuses applications. Mais l'autre avantage (énorme) est que vous pouvez activer des scénarios plus sophistiqués très facilement. Par exemple, vous pouvez maintenant vous fédérer avec les fournisseurs d'identité d'autres organisations.

Hope it helps Eugenio

@RisingStar:

Le jeton (contenant revendications) peut éventuellement être chiffré (sinon ils seront en clair). C'est pourquoi SSL est toujours recommandé pour les interactions entre le navigateur et le STS. Notez que même si elles sont en texte clair, la falsification n'est pas possible parce que le jeton est signé numériquement.

+0

merci Eugenio, je pensais que j'avais lu le Guide d'Identité des Réclamations, évidemment pas parce que j'ai manqué que Fabrikam était une application MVC. Je vais être sûr d'y jeter un coup d'oeil. J'ai aussi jeté un œil sur le blog de Dominick Baier et je pense que faire un appel à un serveur actif depuis le serveur web sur la page de connexion est finalement ce que je cherche. –

+0

Je ne vois pas que l'utilisation de WIF dans ASP.net MVC est différente de celle des formulaires ASP.net. –

+1

Les principes sont exactement les mêmes. Il y a juste quelques détails d'implémentation. Les différences les plus courantes sont: -Dans une application Webforms, vous utilisez généralement WIF pour tous les échanges de protocole (passiveRedirectEnable = true). Dans une application MVC, vous allez désactiver cela et gérer cela par programme comme expliqué dans mon blog. - Dans une application MVC, vous implémentez généralement un attribut IAuthorizationFilter. Dans les formulaires Web, cela n'existe pas et vous dépendez simplement du mécanisme d'autorisation ASP.NET existant (ou appelez IsInRole, etc.) –

13

C'est une question intéressante que vous avez posée. Je sais que pour une raison quelconque, Microsoft a mis en place ce framework "Windows Identity Foundation" sans beaucoup de documentation. Je le sais parce que j'ai été chargé de trouver comment l'utiliser avec un nouveau projet et l'intégrer à l'infrastructure existante. J'ai cherché sur le web pendant des mois à la recherche de bonnes informations. J'ai pris un angle un peu différent pour résoudre le problème que vous décrivez.

J'ai pris une application de connexion existante et y ai intégré la plomberie WIF de Microsoft. Par cela, je veux dire que j'ai une application où un utilisateur se connecte. L'application de connexion soumet les informations d'identification fournies par l'utilisateur à un autre serveur qui retourne l'identité des utilisateurs (ou indique un échec de connexion).

regardant quelques-uns des exemples de Microsoft, je vois qu'ils font ce qui suit: construire un SignInRequestMessage d'un querystring (généré par une application de partie utilisatrice), construire un service de jeton de sécurité d'une classe personnalisée, et enfin appeler FederatedSecurityTokenServiceOperations. ProcessSignInresponse avec l'actuel httpcontext.response. Malheureusement, je ne peux pas vraiment l'expliquer bien ici; vous avez vraiment besoin de regarder les exemples de code.

Une partie de mon code est très similaire à l'exemple de code. Où vous allez être intéressé par la mise en œuvre de beaucoup de votre propre logique est dans le GetOutputClaimsIdentity. C'est la fonction qui construit l'identité de revendications qui décrit l'utilisateur connecté. Maintenant, voici ce que je pense que vous êtes vraiment intéressé à savoir. C'est ce que Microsoft ne vous dit pas dans leur documentation, AFAIK. Une fois que l'utilisateur se connecte, il est redirigé vers l'application de la partie de confiance. Quel que soit le mode de fonctionnement de l'application de connexion, les classes WIF envoient une réponse au navigateur de l'utilisateur contenant une entrée HTML "cachée" contenant le certificat de signature de jeton et les revendications de l'utilisateur. (Les revendications seront en texte clair). À la fin de cette réponse est une redirection vers votre site Web de confiance.Je ne sais rien de cette action parce que je l'ai capturé avec "Fiddler"

Une fois de retour sur le site Web de la partie de confiance, les classes WIF géreront la réponse (avant que votre code ne soit exécuté). Le certificat sera validé. Par défaut, si vous avez configuré le site Web de votre partenaire de confiance avec FedUtil.exe (en cliquant sur "Ajouter une référence STS dans votre application de partie de confiance de Visual Studio), la classe de Microsoft vérifie l'empreinte du certificat."

Cadre WIF définit les cookies dans le navigateur de l'utilisateur (Dans mon expérience, les noms de cookies commencent avec "FedAuth") qui contiennent les revendications des utilisateurs.Les cookies ne sont pas lisibles par l'homme

Une fois que cela se produit, vous pouvez éventuellement effectuer des opérations sur les revendications de l'utilisateur sur le site Web de la partie utilisatrice à l'aide du code ClaimsAuthenticationClass.C'est où votre code est en cours d'exécution.

Je sais que c'est différent de ce que vous décrivez, mais j'ai cette configuration qui fonctionne. J'espère que ça aide!

ps. S'il vous plaît vérifier les autres questions que j'ai posées à propos de Windows Identity Foundation.

MISE À JOUR: Pour répondre à la question dans le commentaire ci-dessous:

Une chose que je me suis permis est que la redirection vers le STS log sur l'application arrive par le biais d'une redirection avec une chaîne de requête contenant l'URL l'application à laquelle l'utilisateur se connecte. Cette redirection se produit automatiquement la première fois qu'un utilisateur tente d'accéder à une page nécessitant une authentification. Alternativement, je crois que vous pourriez faire la redirection manuellement avec le module WSFederationAuthentication.

Je ne l'ai jamais essayé de le faire, mais si vous souhaitez utiliser un journal sur la page dans l'application elle-même, je crois que le cadre devrait vous permettre d'utiliser les éléments suivants:

1) encapsulent votre STS code dans une bibliothèque. 2) Référencez la bibliothèque de votre application. 3) Créez une page de connexion dans votre application. Assurez-vous que cette page ne nécessite pas d'authentification. 4) Définissez la propriété issuer de l'élément wsFederation dans la section Microsoft.IdentityModel de votre web.config sur la page de connexion.

+0

Merci d'avoir pris le temps de répondre à ma question. J'ai regardé à travers le fichier d'aide html compilé qui vient avec le SDK WIF et également parcouru tous les exemples. J'ai séparé 'FAM' et' SessionAuthenticationModule' avec Reflector et je pense que j'ai un bon aperçu de son fonctionnement, mais j'ai été intéressé de voir s'il y a des exemples utilisant le 'FAM' ou peut-être un HttpModule personnalisé en conjonction avec 'SessionAuthenticationModule' pour l'identité basée sur les revendications. Le FAM semble être facile à utiliser, mais ne fournit pas beaucoup de flexibilité ... –

+1

Peut-être que l'idée est que la connexion devrait avoir lieu sur une application web STS car cela signifie que vous n'avez pas besoin de vous soucier de la construction d'un écran de connexion dans chacune de vos applications Web. Cependant, j'aimerais pouvoir garder un aspect spécifique à l'écran de connexion pour chaque application et idéalement le garder sur le même domaine afin de ne pas confondre les utilisateurs (ce qui pourrait arriver car il y a potentiellement beaucoup de non-utilisateurs). utilisateurs avertis de technologie). Je veux juste prendre des informations d'identification entrées, enveloppez-les dans un appel WS-Federated à un STS pour authentifier. Ma pensée est-elle en désaccord avec l'idée? –

+0

Votre pensée n'est pas nécessairement mal alignée. J'ai commencé à avoir déjà une application de connexion séparée qui est utilisée pour d'autres applications; J'ai simplement ajouté le STS à l'application de connexion. Je crois que ce que vous voulez faire est possible, mais il faudra quelques expérimentations pour le faire fonctionner. J'ai mis à jour ma réponse avec une idée de comment vous pourriez faire ce travail. –

4

Ce que vous voulez faire est une connexion active. WIF inclut WSTrustChannel(Factory) qui vous permet de communiquer directement avec le STS et d'obtenir un jeton de sécurité. Si vous voulez que votre formulaire de connexion fonctionne de cette façon, vous pouvez suivre l'exemple "WSTrustChannel" du WIF 4.0 SDK. Une fois que vous avez obtenu le jeton, le code suivant prendra ce jeton et appeler le gestionnaire WIF pour créer une jeton de session et définir le cookie approprié:

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

Une fois que vous avez fait cela, votre site doit se comporter de la même comme si la signature passive avait eu lieu.

1

Vous pouvez utiliser le contrôle FederatedPassiveSignIn.

+0

Ceci est un contrôle côté serveur qui fonctionne bien pour les formulaires Web, mais naturellement ne convient pas aux applications MVC (parce que c'est un contrôle côté serveur avec runat = "server"). Des suggestions à ce sujet? – atconway

0

Définition de votre cookie comme ceci: FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie (sessionToken); Ne fonctionne pas pour SSO à d'autres domaines.

Le cookie doit être défini par le STS et non par le RP.