Sdílet prostřednictvím


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

  1. Vytvoření třídy, která je odvozena od UserNamePasswordValidator.

    
    public class CustomUserNameValidator : UserNamePasswordValidator
    {
    
    Public Class CustomUserNameValidator
        Inherits UserNamePasswordValidator
    
  2. 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

  1. 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í>.

    1. V konfiguračním souboru v části system.serviceModel> element přidejte< element bindings>.<

    2. 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.

    3. mode Nastavte atribut< zabezpečení> nebo< zabezpečení> na Message, Transportnebo .TransportWithMessageCredential

    4. clientCredentialType Nastavte atribut< zprávy> nebo <přenosu.>

      Při použití zabezpečení zprávy nastavte clientCredentialType atribut <zprávy> na UserNamehodnotu .

      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>
    
  2. 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.

    1. Jako podřízený prvek system.serviceModel> přidejte <element behaviors>.<

    2. Přidejte serviceBehaviors> do elementu <behaviors>.<

    3. <Přidejte prvek chování> a nastavte name atribut na odpovídající hodnotu.

    4. Přidejte serviceCredentials> do elementu <chování>.<

    5. <Přidání userNameAuthentication> do <serviceCredentials>

    6. Nastavte userNamePasswordValidationMode na Custom.

      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.

    7. 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

Viz také