Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Kennwortdaten in
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