Problemas com a autenticação WCF
-
22-07-2019 - |
Pergunta
Eu tenho um serviço WCF muito simples que eu gostaria de expor publicamente. Eu criei o serviço e configurá-lo sobre o nosso servidor sem muito incômodo. O problema é que somos capazes de usar o serviço a partir de dentro da nossa rede privada, mas quando tentamos usá-lo de fora da rede, o seguinte erro é jogar:
A interface de negociação Security Support Provider (SSPI) falhou.
Eu fiz uma pequena pesquisa e parece que WCF usa a autenticação do Windows por padrão. Eu gostaria de alterá-lo para usar sem autenticação, mas não estou inteiramente certo como. Veja como meus configuração aparência agora.
<system.serviceModel>
<services>
<service behaviorConfiguration="XX.ZZ.WebService.MyServiceBehavior"
name="XX.ZZ.WebService.MyService">
<endpoint address="" binding="wsHttpBinding" contract="XX.ZZ.WebService.IMyService">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="XX.ZZ.WebService.MyServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Gostaria muito de receber algumas dicas, ou toques na direção certa.
Solução
Bem, o serviço usa o wsHttpBinding, que por padrão vai exigir credenciais de usuário do Windows - que seus usuários externos, obviamente, não vai ter. Não é WCF em si, que usa as credenciais do Windows por padrão (como você estado), mas realmente este particular de ligação (wsHttpBinding) -. Os outros possam padrão para outras configurações
Você tem um par de opções:
- wsHttpBinding configure (que é bastante "peso-pesado") para usar nenhuma segurança em tudo, ou para uso de usuário / senha de segurança que os chamadores teria que fornecer
- uso basicHttpBinding sem segurança em vez (que é o modelo ASMX, basicamente)
Para desligar a segurança completamente do wsHttpBinding, incluir isso em sua configuração:
<bindings>
<wsHttpBinding>
<binding name="NoSecurity">
<security mode="None" />
</binding>
</wsHttpBinding>
</bindings>
e, em seguida, configurar os terminais de uso que a configuração de ligação:
<system.serviceModel>
<services>
<service name="XX.ZZ.WebService.MyService"
behaviorConfiguration="XX.ZZ.WebService.MyServiceBehavior">
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="NoSecurity"
contract="XX.ZZ.WebService.IMyService">
</endpoint>
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
Você poderia fazer o mesmo com <basicHttpBinding>
vez de <wsHttpBinding>
se desejar (não há nenhuma vantagem em usar wsHttpBinding vs. basicHttpBinding, se você desligou segurança e todas as outras características mais avançado que oferece WSHttpBinding).
Há também um realmente bom série Blog pós que falam sobre as noções básicas de segurança do WCF em termos de cinco cenários diferentes, típicas - excelente leitura
!Marc
Outras dicas
Isto dá-lhe a segurança em nível de transporte sem autenticação:
<configuration> <system.serviceModel>
<services>
<service
name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors> </system.serviceModel>
</configuration>
Para outros cenários que eu iria ter um olhar para o amostras Microsoft WCF .
WCF pode ser uma verdadeira dor quando se trata de configurá-lo. Dê uma olhada na WCFSecurity ele fornece amostras de trabalho bons para ambientes de configuração diferentes.