Vorgehensweise: Verwenden eines benutzerdefinierten Benutzernamens und eines Kennwort-Validierungssteuerelements
Wenn ein Benutzername und ein Kennwort für die Authentifizierung verwendet werden, verwendet Windows Communication Foundation (WCF) standardmäßig Windows zum Überprüfen des Benutzernamens und des Kennworts. WCF ermöglich jedoch benutzerdefinierte Benutzernamen- und Kennwortauthentifizierungsschemas, die auch Validierungssteuerelemente genannt werden. Zum Verwenden eines benutzerdefinierten Benutzernamen- und Kennwort-Validierungssteuerelements erstellen und konfigurieren Sie eine Klasse, die sich von UserNamePasswordValidator ableitet.
Eine Beispielanwendung finden Sie unter Benutzernamen- und Kennwort-Validierungssteuerelement.
So erstellen Sie ein benutzerdefiniertes Benutzernamen- und Kennwort-Validierungssteuerelement
Erstellen Sie eine von der UserNamePasswordValidator-Klasse abgeleitete Klasse.
Public Class CustomUserNameValidator Inherits UserNamePasswordValidator
public class CustomUserNameValidator : UserNamePasswordValidator {
Implementieren Sie ein benutzerdefiniertes Authentifizierungsschema, indem Sie die Validate-Methode außer Kraft setzen.
Verwenden Sie nicht den Code des folgenden Beispiels, der die Validate-Methode in einer Produktionsumgebung außer Kraft setzt. Ersetzen Sie den Code mit dem benutzerdefinierten Benutzernamen- und Kennwort-Validierungsschema. Möglicherweise müssen der Benutzername und das zugehörige Kennwort aus einer Datenbank abgerufen werden.
Um Authentifizierungsfehler an den Client zurückzugeben, lösen Sie in der Validate-Methode eine FaultException aus.
' This method validates users. It allows in two users, test1 and test2 ' with passwords 1tset and 2tset respectively. ' This code is for illustration purposes only and ' must not be used in a production environment because it is not secure. Public Overrides Sub Validate(ByVal userName As String, ByVal password As String) If Nothing = userName OrElse Nothing = password Then Throw New ArgumentNullException() End If If Not (userName = "test1" AndAlso password = "1tset") AndAlso Not (userName = "test2" AndAlso password = "2tset") Then ' This throws an informative fault to the client. Throw New FaultException("Unknown Username or Incorrect Password") ' When you do not want to throw an infomative fault to the client, ' throw the following exception. ' Throw New SecurityTokenException("Unknown Username or Incorrect Password") End If End Sub
// This method validates users. It allows in two users, test1 and test2 // with passwords 1tset and 2tset respectively. // This code is for illustration purposes only and // must not be used in a production environment because it is not secure. public override void Validate(string userName, string password) { if (null == userName || null == password) { throw new ArgumentNullException(); } if (!(userName == "test1" && password == "1tset") && !(userName == "test2" && password == "2tset")) { // This throws an informative fault to the client. throw new FaultException("Unknown Username or Incorrect Password"); // When you do not want to throw an infomative fault to the client, // throw the following exception. // throw new SecurityTokenException("Unknown Username or Incorrect Password"); } }
So konfigurieren Sie einen Dienst für das Verwenden eines benutzerdefinierten Benutzernamen- und Kennwort-Validierungssteuerelements
Konfigurieren Sie eine Bindung, die Nachrichtensicherheit über jedes beliebige Transportprotokoll oder Sicherheit auf Transportebene über HTTP(S) verwendet.
Bei Verwendung von Nachrichtensicherheit fügen Sie eine der vom System bereitgestellten Bindungen hinzu, beispielsweise wsHttpBinding Element, oder ein customBinding Element, das Nachrichtensicherheit und den Anmeldeinformationstyp UserName unterstützt.
Wenn Sie Sicherheit auf Transportebene über HTTP(S) verwenden, fügen Sie entweder das wsHttpBinding Element oder das <basicHttpBinding> hinzu oder ein <netTcpBinding> oder ein customBinding Element das mit HTTP(S) und dem Authentifizierungsschema Basic arbeitet.
Hinweis: Wenn Sie .NET Framework, Version 3.5 oder höher verwenden, können Sie ein benutzerdefiniertes Benutzernamen- und Kennwort-Validierungssteuerelement mit Nachrichten- und Transportsicherheit nutzen. In Verbindung mit .NET Framework 3.0 kann ein benutzerdefiniertes Benutzername- und Kennwort-Validierungssteuerelement nur mit Nachrichtensicherheit verwendet werden. Tipp: Weitere Informationen zur Verwendung von <netTcpBinding> in diesem Kontext finden Sie unter <security> of <netTcpBinding> Fügen Sie in der Konfigurationsdatei unterhalb des <system.ServiceModel>-Elements ein <bindings>-Element ein.
Fügen Sie dem Bindungsabschnitt ein wsHttpBinding Element-Element oder <basicHttpBinding>-Element hinzu. Weitere Informationen über zum Erstellen eines WCF-Bindungselements finden Sie unter Vorgehensweise: Angeben einer Dienstbindung in einer Konfiguration.
Legen Sie das mode-Attribut für das security element of wsHttpBinding oder <security> of <basicHttpBinding>MessageTransport auf or, TransportWithMessageCredential, fest.
Legen Sie das clientCredentialType-Attribut des message element of wsHttpBinding oder des <transport> of <wsHttpBinding> fest.
Bei Verwendung von Nachrichtensicherheit legen Sie das clientCredentialType-Attribute des message element of wsHttpBinding auf UserNamefest.
Wenn Sicherheit auf Transportebene über HTTP(S) verwendet wird, legen Sie das clientCredentialType-Attribut des <transport> of <wsHttpBinding><transport> of <basicHttpBinding>Basic oder auf fest.
Hinweis: Wenn ein WCF-Dienst in Internet Information Services (IIS) unter Verwendung von Sicherheit auf Transportebene gehostet wird und die UserNamePasswordValidationMode-Eigenschaft auf Custom festgelegt ist, dann verwendet das benutzerdefinierte Authentifizierungsschema eine Teilmenge der Windows-Authentifizierung. Das liegt daran, dass IIS in diesem Szenario die Windows-Authentifizierung ausführt, bevor WCF den benutzerdefinierten Authentifizierer aufruft
Weitere Informationen über zum Erstellen eines WCF-Bindungselements finden Sie unter Vorgehensweise: Angeben einer Dienstbindung in einer Konfiguration.
Das folgende Beispiel zeigt den Konfigurationscode für die Bindung.
<system.serviceModel> <bindings> <wsHttpBinding> <binding name="Binding1"> <security mode="Message"> <message clientCredentialType="UserName" /> </security> </binding> </wsHttpBinding> </bindings> </system.serviceModel>
Konfigurieren Sie ein Verhalten, das angibt, dass ein benutzerdefiniertes Benutzername- und Kennwort-Validierungssteuerelement verwendet wird, um Benutzernamen/Kennwort-Paare für eingehende UserNameSecurityToken-Sicherheitstoken zu überprüfen.
Fügen Sie ein <system.serviceModel><behaviors>-Element als untergeordnetes Element des-Elements hinzu.
Fügen Sie dem <behaviors>-Element ein serviceBehaviors section-Element hinzu.
Fügen Sie ein <behavior>name-Element hinzu, und legen Sie das -Attribut auf einen passenden Wert fest.
Fügen Sie dem <serviceCredentials> Element-Element ein <behavior>-Element hinzu.
Fügen Sie ein userNameAuthentication element zum <serviceCredentials> Element hinzu.
Legen Sie den userNamePasswordValidationMode auf Custom fest.
Hinweis: Wenn der userNamePasswordValidationMode-Wert nicht festgelegt wird, verwendet WCF die Windows-Authentifizierung anstatt des benutzerdefinierten Benutzernamen- und Kennwort-Validierungssteuerelements. Legen Sie den customUserNamePasswordValidatorType auf den Typ fest, der das benutzerdefinierte Benutzernamen- und Kennwort-Validierungssteuerelement darstellt.
Im folgenden Beispiel sehen Sie das <serviceCredentials>-Fragment bis zu diesem Punkt:
<serviceCredentials> <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Microsoft.ServiceModel.Samples.CalculatorService.CustomUserNameValidator, service" /> </serviceCredentials>
Beispiel
Im folgenden Codebeispiel wird veranschaulicht, wie ein benutzerdefiniertes Benutzernamen- und Kennwort-Validierungssteuerelement erstellt wird. Verwenden Sie nicht den Code, der die Validate-Methode in einer Produktionsumgebung außer Kraft setzt. Ersetzen Sie den Code mit dem benutzerdefinierten Benutzernamen- und Kennwort-Validierungsschema. Möglicherweise müssen der Benutzername und das zugehörige Kennwort aus einer Datenbank abgerufen werden.
Imports System
Imports System.IdentityModel.Selectors
Imports System.IdentityModel.Tokens
Imports System.Security.Principal
Imports System.ServiceModel
...
Public Class CustomUserNameValidator
Inherits UserNamePasswordValidator
' This method validates users. It allows in two users, test1 and test2
' with passwords 1tset and 2tset respectively.
' This code is for illustration purposes only and
' must not be used in a production environment because it is not secure.
Public Overrides Sub Validate(ByVal userName As String, ByVal password As String)
If Nothing = userName OrElse Nothing = password Then
Throw New ArgumentNullException()
End If
If Not (userName = "test1" AndAlso password = "1tset") AndAlso Not (userName = "test2" AndAlso password = "2tset") Then
' This throws an informative fault to the client.
Throw New FaultException("Unknown Username or Incorrect Password")
' When you do not want to throw an infomative fault to the client,
' throw the following exception.
' Throw New SecurityTokenException("Unknown Username or Incorrect Password")
End If
End Sub
End Class
using System;
using System.IdentityModel.Selectors;
using System.IdentityModel.Tokens;
using System.Security.Principal;
using System.ServiceModel;
...
public class CustomUserNameValidator : UserNamePasswordValidator
{
// This method validates users. It allows in two users, test1 and test2
// with passwords 1tset and 2tset respectively.
// This code is for illustration purposes only and
// must not be used in a production environment because it is not secure.
public override void Validate(string userName, string password)
{
if (null == userName || null == password)
{
throw new ArgumentNullException();
}
if (!(userName == "test1" && password == "1tset") && !(userName == "test2" && password == "2tset"))
{
// This throws an informative fault to the client.
throw new FaultException("Unknown Username or Incorrect Password");
// When you do not want to throw an infomative fault to the client,
// throw the following exception.
// throw new SecurityTokenException("Unknown Username or Incorrect Password");
}
}
}
Siehe auch
Aufgaben
Gewusst wie: Verwenden des ASP.NET-Mitgliedschaftsanbieters