web-dev-qa-db-fra.com

Mélange de l'authentification par formulaire avec l'authentification Windows

J'ai une application intranet (ASP.NET 3.5) qui a été conçue pour utiliser l'authentification par formulaires (avec le système d'appartenance par défaut d'aspnet). Je stocke également des informations supplémentaires sur les utilisateurs dans une autre table qui partage sa clé primaire avec la table aspnet_users.

Pour les utilisateurs qui font partie de notre domaine, je stocke leur nom de compte de domaine dans la table des utilisateurs secondaires et je souhaite connecter automatiquement les utilisateurs dont le nom de compte de domaine correspond à un nom stocké dans la table.

J'ai lu les guides disponibles - ils datent tous d'il y a deux ans ou plus et supposons que vous puissiez activer l'authentification Windows sur une page de connexion distincte vous permettant d'extraire le nom du compte de domaine. D'après ce que je peux dire, cela n'est toutefois pas possible dans IIS7 (la méthode d'authentification globale est appliquée à toutes les pages et ne peut pas être désactivée de manière sélective, et les deux méthodes d'authentification ne peuvent pas être appliquées sur la même page).

Existe-t-il un moyen de faire passer IIS par le nom de compte Windows de l'utilisateur demandeur? Je n'ai pas besoin d'une authentification AD appropriée, juste du nom de domaine.

47
dr_draik

En fait, vous pouvez le faire. Un peu en retard pour @dr_draik, mais cela est apparu dans un résultat Google pour moi, alors je pensais partager certaines connaissances.

Si vous êtes en mode classique - Activez l'authentification Windows et par formulaires. Vous recevrez un avertissement sur le fait de ne pas pouvoir faire les deux à la fois, mais vous pouvez l'ignorer . Ensuite, vous pouvez faire du spelunk autour de différentes propriétés telles que Code:

HttpContext.Current.Request.ServerVariables["LOGON_USER"] 

et pêcher le nom d'utilisateur à partir de là.

Si vous êtes en mode intégré - 4021905 L'authentification basée sur le challenge et la redirection de connexion IIS7 ne peuvent pas être utilisées simultanément mène à IIS 7.0 Authentification à deux niveaux avec authentification par formulaire et Authentification Windows qui est un module qui vous permet de modifier de manière sélective l’authentification pour différentes pages.

47
Dan F

Vous pouvez toujours configurer 2 applications distinctes dans IIS7. L'authentification Windows serait activée. L'autre serait l'application principale avec l'authentification par formulaires. Si un utilisateur accède à l'application d'authentification Windows, la page peut récupérer ses informations d'identification et les transmettre à l'application d'authentification de formulaires.

4
David

(Plus pour vraiment l'exhaustivité de l'information)

J'ai posé cette question à un responsable de la sécurité .Net lors d'une conférence il y a quelque temps. Sa réponse fut que c'était (techniquement} _ _ possible, mais il ne l'avait jamais vu se faire (et le lui faire savoir si je le faisais et si cela fonctionnait!).

Il a suggéré de procéder comme suit: créer votre propre filtre ISAPI et l'installer dans IIS. Le filtre ISAPI intercepterait les demandes et effectuerait en gros le travail IIS lors de l’utilisation de l’authentification intégrée, mais reviendrait à utiliser des formulaires s’il n’y en avait pas. Cela impliquait une logique complexe de challenge/réponse dans le filtre. C'était pour IIS6 cependant, donc cela pourrait être différent dans IIS7.

Bien que cela puisse être techniquement possible, je ne recommanderais pas cet itinéraire car cela ressemble à un peu de bidouille, et mettre en place sa propre sécurité n’est jamais une bonne idée (à moins que vous vraiment sachiez que fais tu).

4
adrianbanks

Il existe de nombreux articles sur le mélange d'authenticité en définissant config pour utiliser les formulaires avec un accès anonyme à l'application. Deuxièmement, une page pour l'authentification intégrée doit être créée avec les paramètres IIS configurés pour refuser l'anonymat et utiliser l'authentification intégrée. Le tour de magie serait de vérifier la variable "Logon_User" de la collection ServerVariables du requet. Et enfin, pour que l'authentification intégrée connecte silencieusement l'utilisateur, il doit avoir un nom hébergé court. Ainsi, si votre pièce d’authentification de formulaires est exposée à Internet via un nom de domaine complet, il devrait y avoir une sorte de redirection vers la page hôte courte. Je pense qu'il est possible de réaliser avec une seule application sous IIS avec 2 répertoires virtuels. 

1
dexter

J'ai trouvé une solution n'utilisant aucun add-on spécial. C’était délicat et impliquait de bricoler des éléments de toutes les pages référencées ici . J'ai posté à ce sujet: http://low-bandwidth.blogspot.com.au/2014/11/iis7-mixed-windows-and -forms.html

En substance, les formulaires, les fenêtres et l’authentification unique doivent être activés ... L'écran de connexion doit être basé sur les formulaires et contenir un bouton pour déclencher la connexion Windows, qui envoie un défi de réponse HTTP 401 qui, en cas de succès, crée un ticket de connexion basé sur des formulaires. .

Les problèmes sont assez complexes et la poste passe en revue les principes et la solution en détail.

1
Ben McIntyre

Malheureusement, ce que vous essayez de faire n'est tout simplement pas pris en charge. Pour qu'ASP.NET connaisse le nom d'utilisateur Windows, vous devez utiliser l'authentification Windows.

Vous pouvez configurer un autre répertoire site/virtual qui vient de transférer les informations de nom d'utilisateur vers une autre page. Mais que se passe-t-il lorsque des utilisateurs non authentifiés par Windows essaient de se connecter?

0
Bryan

Je peux essayer quelque chose - je ne sais pas si cela fonctionnera.

Dans le passé, nous utilisions Request.ServerVariables["LOGON_USER"], mais il est évident que pour renvoyer une valeur non vide, vous devez désactiver l'accès anonyme.

Voir cet article: http://support.Microsoft.com/default.aspx/kb/306359

Il suggère de conserver l'accès anonyme du côté IIS et l'authentification par formulaires, mais en refusant l'utilisateur anonyme de la manière suivante:

<authorization>
   <deny users = "?" /> <!-- This denies access to the Anonymous user -->
   <allow users ="*" /> <!-- This allows access to all users -->
</authorization>
0
Krip