Freigeben über


Kennwortdaten in ICredentials können nicht von einem WCF-Client an den WCF-Dienst in .NET Framework 4.5 übergeben werden.

Dieser Artikel hilft Ihnen, das Problem zu beheben, bei dem Kennwortdaten ICredentials nicht von einem WCF-Client an den WCF-Dienst übergeben werden können.

Originalproduktversion: .NET Framework 4.5
Ursprüngliche KB-Nummer: 3082119

Symptome

In einem WCF-Client erstellen Sie eine neue ICredentials Schnittstelle aus der NetworkCredential Klasse mithilfe des angegebenen Benutzernamens und Kennworts. Anschließend rufen Sie eine WCF-Vertragsmethode auf, die als Argument verwendet ICredentials wird. Sie stellen fest, dass die Eigenschaft eine leere Zeichenfolge enthält, ICredentials nachdem Sie das Password empfangene Objekt im WCF-Dienst wieder in eine Netzwerkanmeldeinformation umwandeln. Die Username Eigenschaft enthält jedoch weiterhin einen gültigen, korrekten Wert.

Ursache

Es ist ein bekanntes Problem, das in Microsoft .NET Framework 4.0 eingeführt wurde, als der SecurePassword Klasse eine neue Eigenschaft NetworkCredential hinzugefügt wurde. Diese Eigenschaft überschreibt die ursprüngliche Kennwortzeichenfolge, wenn die SecurePassword Eigenschaft auf der Dienstseite deserialisiert wird. Die SecurePassword-Eigenschaft ist vom Typ SecureString. Standardmäßig wird sie nicht serialisiert und gesendet. Die ursprüngliche Kennwortzeichenfolge wird jedoch mit einem leeren Wert überschrieben. Dieses Verhalten ist auch beabsichtigt.

Beschluss

Um dieses Problem zu beheben, müssen Sie die Benutzernamen- und Kennwortinformationen unabhängig von den Netzwerkanmeldeinformationen an den Dienst übergeben. Sie können dies tun, indem Sie ein anwendungsdefiniertes Objekt erstellen, um die Anmeldeinformationen zu speichern. Übergeben Sie dann die Anmeldeinformationen an eine neue WCF-Dienstmethode, die das Objekt als Methodenargument akzeptiert. Dieses anwendungsdefinierte Objekt enthält vertrauliche Informationen. Es wird empfohlen, die Daten über eine verschlüsselte Verbindung mit dem WCF-Dienst mithilfe von HTTPS-Transportsicherheit oder Nachrichtenschichtsicherheit zu senden.

Code, der das Problem reproduziert

Das folgende Beispiel zeigt einen WCF-Dienst, der das Problem reproduziert. Der WCF-Dienst hat den folgenden Vertrag:

[ServiceContract]
[ServiceKnownType(typeof(NetworkCredential))]
public interface IService
{
    [OperationContract]
    string GetData(ICredentials value);
}

Ein Client verwendet den Dienst wie folgt:

iCredService.ServiceClient svcClient = new iCredService.ServiceClient();
ICredentials iCred = new System.Net.NetworkCredential("ABC", "1234");
string outCome = outCome = svcClient.GetData(iCred);

Wenn Sie Visual Studio verwenden und einen Haltepunkt für den Dienst festlegen, ist dies value.Password leer. Wenn Sie die lokalen Fenster von Microsoft Visual Studio untersuchen, wird der folgende Text angezeigt:

value {System.Net.NetworkCredential} System.Net.ICredentials {System.Net.NetworkCredential}
[System.Net.NetworkCredential] {System.Net.NetworkCredential} System.Net.NetworkCredential
Domain "" string
Password "" string
+ SecurePassword {System.Security.SecureString} System.Security.SecureString
UserName "ABC" string