Erro no cliente WCF em execução no IIS 5.0 com o servidor no Windows 2008
-
23-08-2019 - |
Pergunta
Eu tenho um serviço .Net 3.5 SP1 WCF em execução no IIS 7 em uma máquina Windows 2008. Quando tento conectar a este serviço a partir de um IIS hospedados serviço WCF em execução no IIS 5.0 (Windows XP) .Net 3.5 SP1, eu recebo o seguinte erro:
O provedor de token não pode obter fichas para target: http: // (URL para WCF serviço)
Eu construí um aplicativo de console simples que pode se conectar com êxito ao serviço WCF usando a mesma configuração exata. Eu também construiu uma simples aplicação web hospedada sob o (servidor ASP.Net que vem com o Visual Studio 2008) servidor WebDev e é capaz de se conectar com sucesso para o serviço WCF. Quando eu configurado um diretório virtual dentro do IIS (Windows XP) para apontar para o mesmo diretório que o servidor WebDev, eu recebo o seguinte erro:
Não credenciais estão disponíveis no pacote de segurança
Mas, se eu definir o web.config para transformar a representação em usar minhas credenciais de logon, ele funciona bem. Esta não é uma boa solução a longo prazo, por razões óbvias. A única diferença que eu tenho notado entre os servidores Webdev IIS e são o usuário que cada processo é executado. IIS é executado na conta ASPNet e WebDev é executado sob minha conta.
Aqui está a configuração para a seção WCF no cliente:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="mexBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceThrottling maxConcurrentCalls="200" maxConcurrentSessions="200" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="FABindings" maxReceivedMessageSize="2147483647">
<readerQuotas maxStringContentLength="300000"/>
<security mode="Message">
<message clientCredentialType="Windows" negotiateServiceCredential="false" establishSecurityContext="false" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://<server url>/FinancialAggregator/v3/Services/FAService.svc"
binding="wsHttpBinding" bindingConfiguration="FABindings"
contract="ServiceReference1.IFilteredService" name="FAServiceEndpoint">
<identity>
<servicePrincipalName value="<UsernameRunningTheAppPoolOnW2k8>" />
</identity>
</endpoint>
</client>
Aqui está a configuração do servidor (tal como solicitado):
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="wsHttpBinding" maxReceivedMessageSize="2147483647">
<security mode="Message">
<message establishSecurityContext="false" negotiateServiceCredential="false" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="mexBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceThrottling maxConcurrentCalls="200" maxConcurrentSessions="200" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="mexBehavior" name="FCSAmerica.Financial.Aggregator.Service.FilteredService">
<endpoint name="FAServiceEndpoint" address="" binding="wsHttpBinding" bindingConfiguration="wsHttpBinding" contract="FCSAmerica.Financial.Aggregator.Service.IFilteredService">
</endpoint>
</service>
</services>
Quaisquer pensamentos sobre a causa deste erro?
Obrigado!
Solução 2
Eu acho que a resposta definitiva a esta pergunta é para atualizar simplesmente para um sistema operacional que permite que você defina a identidade de um pool de aplicativos, o que eu tenho feito há séculos.
Obrigado pela consideração.
Matt
Outras dicas
Quando você acessa os serviços via IIS, com impersonate = false, então é a conta ASPNET que é usado para acessar o serviço na máquina Windows 2008.
A conta ASPNET é uma conta local e, portanto, não tem direitos sobre a máquina de 2008.
Existem 3 maneiras que você poderia resolver este:
- Permitir acesso anónimo para o serviço na máquina Windows 2008
- Use impersonate = true (como você tem)
- Alterar a identidade do pool de aplicativos de aspnet para uma conta de domínio com o acesso necessário.