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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top