WCF: la demande de jeton de sécurité n'a pas pu être satisfaite car l'authentification a échoué

StackOverflow https://stackoverflow.com/questions/1639035

Question

J'ai deux services WCF sur le même ordinateur. L'un est l'éditeur et l'autre l'auditeur.

L'éditeur est en train de créer dynamiquement des proxies basés sur un noeud final Je configure le proxy en code comme ceci:

            WSHttpBinding binding = new WSHttpBinding(SecurityMode.Message, true);
            binding.Security.Message.NegotiateServiceCredential = true;
            binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
            binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
            binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
            binding.Security.Message.EstablishSecurityContext = true;
            binding.ReliableSession.Enabled = true;
            binding.TransactionFlow = true;
            return binding;

et ensuite ...

            Binding binding = GetBindingFromAddress(address);

            ChannelFactory<T> factory = new ChannelFactory<T>(binding);
            factory.Credentials.UserName.UserName = "an account on the machine";
            factory.Credentials.UserName.Password = "a password for that account";

            T proxy = factory.CreateChannel(new EndpointAddress(address));

Lorsque je passe mon appel, je reçois le message d'erreur ci-dessus. Voici le fichier de configuration de mon auditeur:

   <service behaviorConfiguration="MEX Enabled" name="InvoiceSubscriber">
<endpoint binding="wsHttpBinding"
          bindingConfiguration="ReliableTransactionalHTTP"
          contract="AtlanticBT.SubscriptionService.Contracts.v1.IAtlanticEvents">
 <identity>
  <dns value="localhost" />
 </identity>
</endpoint>

        <bindings>
        <wsHttpBinding>
            <binding name="ReliableTransactionalHTTP" transactionFlow="true">
                <reliableSession enabled="true"/>
      <security mode="Message">
        <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/>
        <message clientCredentialType="Windows" negotiateServiceCredential="true" 
                 algorithmSuite="Default" establishSecurityContext="true"/>
      </security>
            </binding>
  </wsHttpBinding>
    </bindings>

J'ai vérifié toutes mes listes de contrôle d'accès sur les répertoires hébergeant les services et elles semblent correctes. La sécurité IIS est définie sur Accès anonyme et Authentification Windows.

Donc, si je mets explicitement les informations d'identification dans le code, pourquoi mon auditeur ne peut-il pas s'authentifier?

Était-ce utile?

La solution

Tout d'abord, ce message signifie généralement que les machines ne font pas partie du même domaine et ne peuvent donc pas communiquer à l'aide de la sécurité Windows. Les deux serveurs sont-ils sur le même domaine?

Deuxièmement, vous avez configuré votre ordinateur d'extrémité pour utiliser la sécurité Windows. Vous utilisez la sécurité Windows non seulement au niveau du message, mais au niveau du transport. Les deux semblent exagérés, vous voulez probablement juste faire le transport.

Troisièmement, tout ce que vous avez configuré indique "Je souhaite utiliser l'authentification Windows", mais vous définissez ensuite les propriétés UsernameClientCredentials de ClientCredentials. Ces propriétés ne sont utilisées que pour la sécurité des jetons de nom d'utilisateur, pas Windows. La sécurité Windows va prendre l'identité du thread actuel et la transférer.

En supposant que votre intention était d'utiliser la sécurité Windows, vous devez soit:

  1. Exécutez votre processus de publication sous une identité Windows unique pour communiquer avec les abonnés.
  2. Utilisez l'emprunt d'identité dans le processus de publication pour modifier le contexte de sécurité de chaque appel (consultez WindowsIdentity.Impersonate pour plus d'informations)

Techniquement, vous faites # 1 même si vous pensez le faire # 2 en définissant les propriétés de nom d'utilisateur / mot de passe car elles sont ignorées.

Enfin, voici une bonne documentation sur la configuration de vos liaisons pour différents types de scénarios d'authentification Windows:

Au-delà de cela, je ne sais pas quoi d'autre je peux donner sans plus d'informations de votre part. Si vous révisez votre question pour fournir des informations complémentaires / répondez à certaines de mes questions, je réviserai volontiers ma réponse afin de la rendre, espérons-le, plus utile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top