WCF: O pedido de token de segurança não poderia ser satisfeita porque a autenticação falhou
-
08-07-2019 - |
Pergunta
Eu tenho dois serviços WCF na mesma máquina. Um deles é o editor e um é o ouvinte.
O Editor está criando dinamicamente proxies com base em e ponto final. Estou configurando o proxy no código como este:
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, em seguida, ...
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 vou fazer o meu apelo recebo o erro acima. Aqui está o meu arquivo de configuração ouvinte:
<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>
Eu verifiquei toda a minha ACL nos diretórios que hospedam os serviços e eles parecem estar corretas. segurança do IIS está definido para acesso anônimo e autenticação do Windows.
Então, se eu estou definindo explicitamente as credenciais no código, por que não pode o meu ouvinte autenticar?
Solução
Em primeiro lugar, esta mensagem normalmente significa que as máquinas não estão no mesmo domínio e, portanto, não podem se comunicar usando a segurança do Windows. São os dois servidores estão no mesmo domínio?
Em segundo lugar, você configurou o seu endpoint de usar a segurança do Windows. Você está usando a segurança do Windows não só no nível de mensagem, mas no nível de transporte. Ambos parece um exagero, você provavelmente só quero fazer o transporte.
Em terceiro lugar, tudo o que você tiver configurado diz "eu quero usar a autenticação do Windows", mas então você está definindo as propriedades UsernameClientCredentials dos ClientCredentials. Essas propriedades são usados ??somente para usuário token de segurança, não o Windows. segurança do Windows vai levar a identidade do segmento atual e enviá-lo.
Assumindo que a sua intenção era estar usando a segurança do Windows, então você quer necessidade de:
- Execute o processo publisher sob uma única identidade do Windows que você quer que seja a comunicação com os assinantes como.
- Use representação dentro do processo de editor para alterar o contexto de segurança para cada chamada (olhar em WindowsIdentity.Impersonate para mais informações)
Agora você está tecnicamente fazendo # 1 mesmo se você pensa que está fazendo # 2, definindo as propriedades nome de usuário / senha, uma vez que estão sendo ignoradas.
Finalmente, aqui está uma boa documentação sobre como configurar seu ligações para diferentes tipos de cenários de autenticação do Windows:
- Transporte de segurança com autenticação do Windows
- Message Security com Windows Client
- Message Security com Windows Client sem credencial Negociação
Além disso, eu não tenho certeza o que mais eu posso dar, sem mais informações de você. Se você revisar sua pergunta para fornecer mais algumas informações / responder a algumas das minhas perguntas terei prazer em rever a minha resposta para espero torná-lo mais útil.