Comment convertir WindowsIdentity à un NetworkCredential?
Comment convertir un WindowsIdentity
à un NetworkCredential
? Je suis en train de tester mon service WCF pour vérifier que les appelants anonymes sont bloqués. Pour ce faire, je veux faire quelque chose comme:
myProxy.ClientCredentials.Windows.ClientCredential = foo(WindowsIdentity.GetAnonymous());
où foo
est une méthode qui convertit un WindowsIdentity
à un NetworkCredential
Cette SORTE de Réponse me semble qu'il va répondre à votre question: stackoverflow.com/questions/2063408/...
Non, il n'est pas. Pour une chose, WindowsIdentity.GetAnonymous().Usurper l'identité d'() donne une exception. Cela est également documenté dans le msdn.microsoft.com/en-us/library/w070t6ka.aspx. InvalidOperationException Une identité anonyme a tenté d'effectuer une usurpation d'identité. Il semble comme il n'y a aucun moyen de le faire ce qui est demandé dans la question. Alors, comment fait-on vérifier qu'un service est de ne pas laisser les utilisateurs anonymes?
Votre question titre est après la conversion de WindowsIdentity à NetworkCredential, mais après re-lecture de votre question plusieurs fois, vous n'avez besoin que d'obtenir un "anonyme" de l'utilisateur? réglage des informations d'identification client à null fera l'affaire, permettra de poster du code
réglage des informations d'identification client à null ne fonctionnera pas. Vous pouvez l'essayer pour vous-même.
ok, mais cela fonctionne pour nous. Bien que vous avez trouvé une réponse 🙂
Non, il n'est pas. Pour une chose, WindowsIdentity.GetAnonymous().Usurper l'identité d'() donne une exception. Cela est également documenté dans le msdn.microsoft.com/en-us/library/w070t6ka.aspx. InvalidOperationException Une identité anonyme a tenté d'effectuer une usurpation d'identité. Il semble comme il n'y a aucun moyen de le faire ce qui est demandé dans la question. Alors, comment fait-on vérifier qu'un service est de ne pas laisser les utilisateurs anonymes?
Votre question titre est après la conversion de WindowsIdentity à NetworkCredential, mais après re-lecture de votre question plusieurs fois, vous n'avez besoin que d'obtenir un "anonyme" de l'utilisateur? réglage des informations d'identification client à null fera l'affaire, permettra de poster du code
réglage des informations d'identification client à null ne fonctionnera pas. Vous pouvez l'essayer pour vous-même.
ok, mais cela fonctionne pour nous. Bien que vous avez trouvé une réponse 🙂
OriginalL'auteur morpheus | 2013-03-07
Vous devez vous connecter pour publier un commentaire.
Généralement foo n'existe pas. Depuis un NetworkCredential est un objet plus large que WindowsIdentity. C'est-à-dire que je peux utiliser NetworkCredential où j'ai besoin d'un WindowsIdentity mais pas l'inverse.
La raison en est que la sécurité.
NetworkCredential signifie que vous êtes autorisé à prendre cette Identité et de l'utilisation de ses informations d'IDENTIFICATION sur une AUTRE machine.
Cela signifie que
Je vais supposer que les informations d'identification sont venus d'une autre machine (en raison de la WCF). Encore pour des raisons de sécurité, Réseau d'informations d'Identification a été converti en un LocalCredential lors de la traversée sur cette machine (à moins que nous parlons de la Délégation plutôt que de l'usurpation d'identité). La machine client a DONNÉ le droit d'utiliser ses pouvoirs sur la machine serveur et seulement la machine serveur.
Si vous voulez obtenir le NetworkCredential en arrière, vous avez besoin de faire quelque chose qui s'appelle la Délégation, à cause de ce qu'on appelle le Multi-Hop problème. Cela implique de Kerberos, trois dirigé mal de chien des enfers. Vous ne voulez pas avoir affaire avec Kerberos.
De manière générale, par défaut WCF procurations de ne pas envoyer des informations d'identification avec leurs appels. En général, vous devez définir la ClientCredentials ou un ensemble
Ne soit normalement pas d'informations d'identification, et donc Anonyme auth.
OriginalL'auteur Aron
Pour répondre à ma propre question:
Il n'est pas possible de convertir un
WindowsIdentity
à unNetworkCredential
. Pour tester si anonyme que les appelants sont bloqués, d'usurper l'identité du thread en cours avec un null jeton de session, et ensuite faire un appel de service WCF. Remarque: ne pas utiliser WindowsIdentity.GetAnonymous. Cette méthode est inutile (deviner qu'elle était mal mis en œuvre, et n'a jamais été corrigé). Code pour usurper l'identité d'thread en cours avec la valeur null jeton de session (pas de gestion d'erreur est effectué):De sortie:
En réponse à Edmund commentaire, réglage
proxy.ClientCredentials.Windows.ClientCredential
ànull
ne va pas faire ce qui est en retrait - faire la demande d'un utilisateur anonyme. Voici mon test complet du code et de sa sortie:Code De Service:
De configuration du Service:
Code Client:
De la configuration du Client:
De sortie:
OriginalL'auteur morpheus
Nous avons un ensemble de tests que nous le faisons et nous utilisons cette méthode d'assistance:
utilisation dans les tests:
vous pouvez tester utilisateur anonyme lorsque vous passer la valeur null dans les informations d'identification du client
OriginalL'auteur EdmundYeung99