Kennwortdaten ICredentials können in der .NET Framework 4.5 nicht von einem WCF-Client an den WCF-Dienst ü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.
Ursprüngliche Produktversion: .NET Framework 4.5
Ursprüngliche KB-Nummer: 3082119
Problembeschreibung
In einem WCF-Client erstellen Sie eine neue ICredentials Schnittstelle aus der Klasse NetworkCredential 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, nachdem Sie die ICredentials im WCF-Dienst empfangenen Anmeldeinformationen in eine Netzwerkanmeldeinformationen umgewandelt Password haben. Die Eigenschaft enthält jedoch Username weiterhin einen gültigen, korrekten Wert.
Ursache
Es ist ein bekanntes Problem, das in Microsoft .NET Framework 4.0 eingeführt wurde, als der Klasse eine neue Eigenschaft SecurePassword hinzugefügt NetworkCredential wurde. Diese Eigenschaft überschreibt die ursprüngliche Kennwortzeichenfolge, wenn die SecurePassword Eigenschaft dienstseitig deserialisiert wird. Die SecurePassword Eigenschaft ist vom Typ SecureString . Standardmäßig wird sie nicht serialisiert und gesendet. Die ursprüngliche Kennwortzeichenfolge wird jedoch mithilfe eines leeren Werts überschrieben. Dieses Verhalten ist auch entwurfsbedingt.
Lösung
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, das die Anmeldeinformationen enthält. Ü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 Nachrichtenebenensicherheit 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 beim Dienst festlegen, ist der value.Password Wert leer. Wenn Sie die Fenster Microsoft Visual Studio lokal anzeigen, 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