Postupy: Použití validátoru vlastního uživatelského jména a hesla
Pokud se pro ověřování používá uživatelské jméno a heslo, windows Communication Foundation (WCF) ve výchozím nastavení používá windows k ověření uživatelského jména a hesla. WCF však umožňuje vlastní uživatelská jména a schémata ověřování hesel, označovaná také jako validátory. Pokud chcete začlenit vlastní validátor uživatelského jména a hesla, vytvořte třídu odvozenou od UserNamePasswordValidator a pak ji nakonfigurujte.
Ukázkovou aplikaci najdete v tématu Validátor hesla uživatelského jména.
Vytvoření vlastního validátoru uživatelského jména a hesla
Vytvoření třídy, která je odvozena od UserNamePasswordValidator.
public class CustomUserNameValidator : UserNamePasswordValidator {
Public Class CustomUserNameValidator Inherits UserNamePasswordValidator
Implementujte vlastní schéma ověřování přepsáním Validate metody.
Nepoužívejte kód v následujícím příkladu, který přepíše metodu Validate v produkčním prostředí. Nahraďte kód vlastním uživatelským jménem a schématem ověřování hesla, které může zahrnovat načtení párů uživatelských jmen a hesel z databáze.
Pokud chcete vrátit chyby ověřování zpět klientovi, vyvolte metodu FaultExceptionValidate .
// 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 informative fault to the client, // throw the following exception. // throw new SecurityTokenException("Unknown Username or Incorrect Password"); } }
' 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 = "[PLACEHOLDER]") AndAlso Not (userName = "test2" AndAlso password = "[PLACEHOLDER]") 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 informative fault to the client, ' throw the following exception: ' Throw New SecurityTokenException("Unknown Username or Incorrect Password") End If End Sub
Konfigurace služby pro použití vlastního uživatelského jména a validátoru hesla
Nakonfigurujte vazbu, která používá zabezpečení zpráv pro všechny přenosy nebo zabezpečení na úrovni přenosu přes protokol HTTP(S).
Při použití zabezpečení zpráv přidejte jednu ze systémových vazeb, jako <je wsHttpBinding> nebo< customBinding>, která podporuje zabezpečení zpráv a
UserName
typ přihlašovacích údajů.Při použití zabezpečení na úrovni přenosu přes HTTP(S) přidejte buď wsHttpBinding>, nebo <basicHttpBinding>, <netTcpBinding nebo< customBinding>>, který používá HTTP(S) a
Basic
schéma ověřování.<Poznámka:
Při použití rozhraní .NET Framework 3.5 nebo novějších verzí můžete použít vlastní validátor uživatelského jména a hesla se zabezpečením zpráv a přenosu. S WinFX je možné použít vlastní validátor uživatelského jména a hesla pouze se zabezpečením zpráv.
Tip
Další informace o používání <netTcpBinding> v tomto kontextu najdete v tématu <zabezpečení>.
V konfiguračním souboru v části system.serviceModel> element přidejte< element bindings>.<
Přidejte do oddílu vazby element wsHttpBinding> nebo <basicHttpBinding>.< Další informace o vytvoření elementu vazby WCF naleznete v tématu Postupy: Určení vazby služby v konfiguraci.
mode
Nastavte atribut< zabezpečení> nebo< zabezpečení> naMessage
,Transport
nebo .TransportWithMessageCredential
clientCredentialType
Nastavte atribut< zprávy> nebo <přenosu.>Při použití zabezpečení zprávy nastavte
clientCredentialType
atribut <zprávy> naUserName
hodnotu .Při použití zabezpečení na úrovni přenosu přes HTTP(S) nastavte
clientCredentialType
atribut <přenosu> nebo <přenosu> do .Basic
Poznámka:
Pokud je služba WCF hostovaná v Internetová informační služba (IIS) pomocí zabezpečení na úrovni přenosu a UserNamePasswordValidationMode vlastnost je nastavena na Custom, vlastní schéma ověřování používá podmnožinu ověřování systému Windows. Důvodem je to, že v tomto scénáři služba IIS provádí ověřování systému Windows před vyvoláním vlastního ověřovacího objektu WCF.
Další informace o vytvoření elementu vazby WCF naleznete v tématu Postupy: Určení vazby služby v konfiguraci.
Následující příklad ukazuje konfigurační kód pro vazbu:
<system.serviceModel> <bindings> <wsHttpBinding> <binding name="Binding1"> <security mode="Message"> <message clientCredentialType="UserName" /> </security> </binding> </wsHttpBinding> </bindings> </system.serviceModel>
Nakonfigurujte chování, které určuje, že se k ověření uživatelského jména a párů hesel pro příchozí UserNameSecurityToken tokeny zabezpečení používá vlastní validátor uživatelského jména a hesla.
Jako podřízený prvek system.serviceModel> přidejte <element behaviors>.<
Přidejte serviceBehaviors> do elementu <behaviors>.<
<Přidejte prvek chování> a nastavte
name
atribut na odpovídající hodnotu.Přidejte serviceCredentials> do elementu <chování>.<
Nastavte
userNamePasswordValidationMode
naCustom
.Důležité
Pokud hodnota
userNamePasswordValidationMode
není nastavená, WCF místo vlastního uživatelského jména a validátoru hesla používá ověřování systému Windows.customUserNamePasswordValidatorType
Nastavte typ, který představuje vaše vlastní uživatelské jméno a validátor hesla.
Následující příklad ukazuje
<serviceCredentials>
fragment do tohoto bodu:<serviceCredentials> <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Microsoft.ServiceModel.Samples.CalculatorService.CustomUserNameValidator, service" /> </serviceCredentials>
Příklad
Následující příklad kódu ukazuje, jak vytvořit vlastní uživatelské jméno a validátor hesla. Nepoužívejte kód, který přepíše metodu Validate v produkčním prostředí. Nahraďte kód vlastním uživatelským jménem a schématem ověřování hesla, které může zahrnovat načtení párů uživatelských jmen a hesel z databáze.
using System;
using System.IdentityModel.Selectors;
using System.IdentityModel.Tokens;
using System.Security.Principal;
using System.ServiceModel;
Imports System.IdentityModel.Selectors
Imports System.IdentityModel.Tokens
Imports System.Security.Principal
Imports 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 informative fault to the client,
// throw the following exception.
// throw new SecurityTokenException("Unknown Username or Incorrect Password");
}
}
}
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 = "[PLACEHOLDER]") AndAlso Not (userName = "test2" AndAlso password = "[PLACEHOLDER]") 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 informative fault to the client,
' throw the following exception:
' Throw New SecurityTokenException("Unknown Username or Incorrect Password")
End If
End Sub
End Class