L'usurpation d'identité et CredentialCache.DefaultCredentials donne HTTP 401 non autorisé
J'ai un service web ASMX (sur mon localhost - WinXP IIS 5.1) que j'ai appeler à partir d'un client web. Mon webservice doit consommer un autre service web ASMX (sur un Win 2003 serveur IIS 6.0).
Quand je fournir des informations d'identification dans mon webservice code dans un codées "en dur":
engineWSE.Credentials = new System.Net.NetworkCredential("myUser", "myPass", "myDomain");
...subséquente d'invoquer le service web distant fonctionne très bien.
Maintenant, je suis en train d'usurper l'identité de moi-même dans certains tests initiaux. Ma première lecture sur ce dit moi, ce peut être un grand sujet, mais voici ce que j'ai fait pour les débutants:
-
DÉCOCHÉ "accès Anonyme" dans mon
le répertoire virtuel pour le WebClient
site sur mon localhost -
dans le web.config de mon client web site, j'ai créé: authentication mode="Windows" et de l'identité d'usurper l'identité d'="true"
-
dans le webmethod de mon webservice qui a appeler le service à distance,
J'ai changé pour:engineWSE.Credentials = System.Net.CredentialCache.DefaultCredentials;
-
Lorsque la distance webservice est appelé avec ces
DefaultCredentials, j'ai l'
erreur suivant:Système.Web.Services
Système.Web.Services.Les protocoles.SoapException: le Serveur n'a pas pu traiter la demande.--->Système.Net.WebException: La demande a échoué avec l'état HTTP 401: non autorisé.
au Système.Web.Services.Les protocoles.SoapHttpClientProtocol.ReadResponse
(SoapClientMessage message, WebResponse réponse, Flux responseStream, Boolean asyncCall)au Système.Web.Services.Les protocoles.SoapHttpClientProtocol.Invoke(Chaîne methodName, Object[] paramètres)
Je ne suis pas sûr de savoir si j'ai mal compris et essayé de sur-simplifier "usurpation d'identité", ou si la distance webservice est en quelque sorte filaire pour n'accepter que les informations d'identification avec 3 arguments (c'est à dire nom d'utilisateur, mot de passe, nom de domaine).
OriginalL'auteur John Adams | 2009-04-07
Vous devez vous connecter pour publier un commentaire.
@Michael Levy dit, c'est un double saut problème. Ce que cela signifie est que si vous ne configurez Kerberos (Négocier), NTLM est probablement utilisé dans un environnement windows qui exécute IIS, avoir un client disposant d'un navigateur sur Une machine en essayant d'accéder au site sur la machine B, auront accès au site, MAIS, lorsque ce site va essayer de contacter le service sur la machine C, la piscine, les informations d'identification devrait être utilisé à la place.
La même chose est vraie pour le site Un service d'appels B qui appelle à son tour de service C.
Lors de la configuration de Kerberos pour les sites web, plusieurs choses doivent être prises en compte. La première est de savoir si c'est une ferme ou pas. Si elle est, vous devez définir un utilisateur commune pour la Piscine pour toutes les machines de la partie de la ferme. Cela est nécessaire parce que Kerberos utilise le nom de domaine pour identifier les principaux utilisée pour chiffrer les jetons de sécurité.Si vous aviez des différents utilisateurs sur les différentes machines de la même batterie de serveurs, car ils sont tous accessibles par le même nom de domaine, toutes les demandes de recherche pour la même entrée. De plus amples détails peuvent être trouvés ici sur Kerberos et l'équilibrage de la charge.
Par exemple, disons que vous avez un site avec myApp.intranet sous forme d'une URL. Dans l'ANNONCE, vous avez un nom principal de service mis à, disons, myUser dans le domaine Mondomaine (setspn -S MyDomain\myUser HTTP/myapp.intranet). Lorsque la demande est envoyée à la KDN (voir kerberos liens à la fin pour plus d'infos sur KDN), il retournera toujours un jeton chiffré avec myUser mais IIS va essayer de le décrypter avec les différents utilisateurs. Il peut être tentant de créer plusieurs SPN pour un même service (HTTP/myapp.intranet), mais ce serait faire RCOND erreur.
Aussi, si vous êtes sur IIS 7+, vous aurez à donner un peu de détail dans votre ApplicationHost.config si vous voulez garder l'authentification en mode Noyau activé (ce qui est fortement recommandé): useAppPoolCredentials=true. Cette valeur doit être définie sur configuration\système.webServer\security\authentication\windowsAuthentication. C'est parce que par défaut, En mode noyau auth allons utiliser le compte d'Ordinateur, pas de la piscine compte et ce serait de nous ramener à la multi-utilisateurs.
Dans tous les cas, la Cette confiance de l'utilisateur pour ... de la Délégation de l'onglet de l'ANNONCE principale doit être activé pour que la délégation du travail. Ensuite, vous devez décider si vous souhaitez utiliser générale ou de la délégation contrainte.
Comme je l'ai dit plus tôt, vous devez également définir un nom principal de service pour le droit de l'utilisateur et le bon service. L'utilisateur est assez facile d'identifier sinc il sera celui que vous avez défini sur votre piscine, mais le service peut obtenir un peu difficile en fonction de votre configuration. DNS, navigateur, et probablement d'autres variables peuvent changer ce qui doit être utilisée. Nos essais et erreurs ont montré les éléments suivants:
Notez que si aucun nom principal de service est spécifiquement définie et que vous accédez à votre site web à travers le nom NetBIOS, le HTTP/machine de service vous sera demandé et que, par défaut, Service d'ACCUEIL (search for extra) peut être utilisé à la place de HTTP ACCUEIL/machine serait utilisée. Cela peut être utile pour une configuration facile sur un petit réseau.
Il est également à garder à l'esprit que si vous voulez limiter les temps d'arrêt lors du passage de NTLM pour l'authentification Kerberos, vous devez tout d'abord modifier le ApplicationHost, puis, utilisez la commande SetSPN. Vous pouvez également désactiver négocier avant toute action et de ne garder que NTLM jusqu'à ce que tout est mis en place et ensuite, si possible, permettre à négocier uniquement (sans NTLM). Cela devrait forcer les clients à modifier la manière dont ils accèdent à votre site web. Si vous ne le faites pas, le mécanisme de mise en cache semble avoir tendance à garder sur NTLM pour un certain temps.
En espérant que cela peut aider. Si vous avez encore le problème de la configuration de Kerberos, WireShark est votre plus fidèle ami. Vous trouverez des informations sur comment déboguer Kerberos dans les pages suivantes:
- Debug Kerberos pour un site web
- Debug AD problèmes avec Kerberos (max taille de jeton est l'un d'eux)
- Kerberos outils et d'autres liens
- Général de la capture réseau Kerberos débogage
OriginalL'auteur bkqc
Avez-vous utilisé netmon ou wireshark pour assurez-vous que les informations d'identification sont passé? Quel est le journal sur le fournisseur de services de vous dire? Aussi, assurez-vous il n'y a pas d'usurpation d'identité tag configuré dans le web.config (ou d'autres .config).
EDIT:
Un HostingEnvironment.Usurper l'identité d'() bloc peut-être-qui utilise le pool d'application de l'identité par défaut, ou l'identité d'un utilisateur jeton de vous le transmettre.
vous pouvez définir les informations d'identification utilisateur pour usurper l'identité d': msdn.microsoft.com/en-us/library/xh507fc5(SV.71).aspx. Voir la troisième case grise en exemple.
OriginalL'auteur andrewbadera
Selon le site web MSDN suivant l'article, il ne fonctionnera pas pour le HTTP et le FTP protcols. Vous devrez fournir explicitement les informations d'identification lorsque vous établissez une connexion au serveur distant.
Avez-vous réglé votre répertoire virtuel pour l'authentification Windows Intégrée
OriginalL'auteur Michael Kniskern
@ Michael Kniskern - Il est certainement possible avec HTTP. Le usurper l'identité d'fonctionnalité de transmettre les informations d'identification de l'ASP.Net application à IIS. Avec l'Authentification Windows Intégrée, l'utilisateur final des informations d'identification sera alors utilisé à la place de la valeur par défaut du compte ASPNET (ou compte joint à l'Application de la Piscine). Que l'article MSDN mention pour le HTTP et le FTP a été réalisé à DefaultNetworkCredentials, je crois.
OriginalL'auteur
Cette est double classique-hop de problème vous ne pouvez pas utiliser les informations d'identification des utilisateurs acquise grâce à l'emprunt d'identité pour accéder à un autre serveur, à moins que la Délégation Kerberos est correctement configuré dans votre domaine. Double de cette question
OriginalL'auteur Michal Levý