Dados de senha em ICredentials não podem ser passados de um cliente do WCF para o serviço WCF no.NET Framework 4.5

IMPORTANTE: Este artigo foi traduzido pelo software de tradução automática da Microsoft e eventualmente pode ter sido editado pela Microsoft Community através da tecnologia Community Translation Framework (CTF) ou por um tradutor profissional. A Microsoft oferece artigos traduzidos automaticamente por software, por tradutores profissionais e editados pela comunidade para que você tenha acesso a todos os artigos de nossa Base de Conhecimento em diversos idiomas. No entanto, um artigo traduzido pode conter erros de vocabulário, sintaxe e/ou gramática. A Microsoft não é responsável por qualquer inexatidão, erro ou dano causado por qualquer tradução imprecisa do conteúdo ou por seu uso pelos nossos clientes.

Clique aqui para ver a versão em Inglês deste artigo: 3082119
Sintomas
Para criar uma nova interface ICredentials da classeNetworkCredential em um cliente Windows Communication Foundation (WCF), usando o nome de usuário e a senha especificados. Em seguida, você pode fazer uma chamada para um método de contrato do WCF que usa ICredentials como um argumento. Você encontra depois que você converter ICredentials que são recebidas no serviço do WCF para uma credencial de rede, a propriedade Password contém uma seqüência de caracteres vazia. No entanto, a propriedade Usernameé mantém um valor válido, correto.
Causa
Este é um problema conhecido que foi introduzido no Microsoft.NET Framework 4.0 quando uma nova propriedade, SecurePassword, foi adicionado à classe NetworkCredential. Esta propriedade substitui a cadeia de caracteres de senha original quando a propriedade SecurePassword é desserializada no lado do serviço. A propriedade SecurePasswordé do tipo SecureString. Por design, ele ainda não serializado e enviado. No entanto, ele substitui a cadeia de caracteres de senha original usando um valor vazio. Esse comportamento também ocorre por design.
Resolução
Para corrigir esse problema, você precisa passar as informações de nome de usuário e senha para o serviço independentemente das credenciais de rede. Você pode fazer isso criando um objeto definido pela aplicação para manter as credenciais e passar as credenciais para um novo método de serviço WCF que aceita o objeto como um argumento de método. Porque esse objeto definido pela aplicação contém informações confidenciais, werecommend os dados enviados através de uma conexão criptografada para o serviço WCF usando o https transporte segurança ou segurança de camada de mensagem.
Mais Informações
A followingexample mostra um serviço WCF que reproduz o problema. O serviço WCF tem o seguinte contrato:

[ServiceContract]
[ServiceKnownType(typeof(NetworkCredential))]
interface pública IO serviço
{

[OperationContract]
string GetData(ICredentials value);
}

Um cliente é usando o serviço da seguinte maneira:

iCredService.ServiceClient svcClient = iCredService.ServiceClient() novo;
ICredentials iCred = new System.Net.NetworkCredential ("ABC", "1234");
Resultado da seqüência de caracteres = resultado = svcClient.GetData(iCred);

Usando o Visual Studio e definindo um ponto de interrupção no serviço o valor. Senha estará vazia. Quando você examinar as janelas de locais do Microsoft Visual Studio, você vê o seguinte texto:

-value{System.Net.NetworkCredential}System.Net.ICredentials {System.Net.NetworkCredential}
-[System.Net.NetworkCredential]{System.Net.NetworkCredential}System.Net.NetworkCredential
Domínio"string"
Senha"string"
+SecurePassword{System.Security.SecureString}System.Security.SecureString
Cadeia de caracteres do nome de usuário "ABC"
ICredentials NetworkCredential SecurePassword WCF

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 3082119 - Última Revisão: 08/28/2015 19:17:00 - Revisão: 1.0

Microsoft .NET Framework 4.0, Microsoft .NET Framework 4.5, Windows Communication Foundation 4, Windows Communication Foundation 4.5

  • kbmt KB3082119 KbMtpt
Comentários