WCF: la richiesta di token di sicurezza non è stata soddisfatta perché l'autenticazione non è riuscita

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

Domanda

Ho due servizi WCF sulla stessa macchina. Uno è l'editore e l'altro è l'ascoltatore.

L'editore sta creando dinamicamente proxy basati su ed endpoint. Sto configurando il proxy in codice come questo:

            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;

e poi ...

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

Quando vado a fare la mia chiamata ricevo l'errore sopra. Ecco il mio file di configurazione del listener:

   <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>

Ho controllato tutti i miei ACL nelle directory che ospitano i servizi e sembrano essere corretti. La sicurezza IIS è impostata su Accesso anonimo e Autenticazione di Windows.

Quindi, se sto impostando esplicitamente le credenziali nel codice, perché il mio ascoltatore non può autenticarsi?

È stato utile?

Soluzione

In primo luogo, questo messaggio indica in genere che le macchine non si trovano nello stesso dominio e, quindi, non possono comunicare utilizzando la sicurezza di Windows. I due server si trovano nello stesso dominio?

Secondo, hai configurato il tuo endpoint per usare la sicurezza di Windows. Stai utilizzando la sicurezza di Windows non solo a livello di messaggio, ma a livello di trasporto. Entrambi sembrano eccessivi, probabilmente vuoi solo fare i trasporti.

Terzo, tutto ciò che hai configurato dice "Voglio usare l'autenticazione di Windows", ma poi stai impostando le proprietà UsernameClientCredentials di ClientCredentials. Tali proprietà vengono utilizzate solo per la sicurezza del token nome utente, non per Windows. La sicurezza di Windows prenderà l'identità del thread corrente e lo inoltrerà.

Supponendo che la tua intenzione fosse quella di utilizzare la sicurezza di Windows, allora devi o:

  1. Esegui il processo del publisher con un'unica identità di Windows che desideri comunicare con gli abbonati come.
  2. Usa la rappresentazione nel processo del publisher per modificare il contesto di sicurezza per ogni chiamata (esamina WindowsIdentity.Impersonate per maggiori informazioni)

In questo momento stai tecnicamente facendo il numero 1 anche se pensi di fare il numero 2 impostando le proprietà nome utente / password poiché vengono ignorate.

Infine, ecco una buona documentazione su come impostare i binding per diversi tipi di scenari di autenticazione di Windows:


Oltre a ciò, non sono sicuro di cos'altro posso dare senza ulteriori informazioni da te. Se rivedi la tua domanda per fornire ulteriori informazioni / rispondere ad alcune delle mie domande, rivedrò volentieri la mia risposta per renderla più utile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top