Поделиться через


Как использовать пользовательский проверяющий элемент управления для имени пользователя и пароля

Когда для проверки подлинности используются имя пользователя и пароль, по умолчанию Windows Communication Foundation (WCF) использует Windows для проверки имени пользователя и пароля. Однако WCF позволяет применение пользовательских схем проверки подлинности имени пользователя и пароля, которые также известны как проверяющие элементы управления. Чтобы внедрить пользовательский проверяющий элемент управления для проверки подлинности имени пользователя и пароля, необходимо создать класс, унаследованный от класса UserNamePasswordValidator, и настроить его.

Пример приложения см. в разделе Проверяющий элемент управления для имен пользователей и паролей.

Создание пользовательского проверяющего элемента управления для имени пользователя и пароля

  1. Создайте класс, наследующий от класса UserNamePasswordValidator.

    Public Class CustomUserNameValidator
        Inherits UserNamePasswordValidator
    
    public class CustomUserNameValidator : UserNamePasswordValidator
    {
    
  2. Реализуйте пользовательскую схему проверки подлинности, переопределив метод Validate.

    Не используйте код следующего примера, переопределяющий метод Validate, в производственной среде. Замените код на свою собственную схему проверки подлинности имени пользователя и пароля, в которой может применяться извлечение пар имени пользователя и пароля из базы данных.

    Чтобы вернуть ошибки проверки подлинности клиенту, создайте исключение FaultException в методе Validate.

    ' 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");
        }
    }
    

Настройка службы для использования пользовательского проверяющего элемента управления для проверки имени пользователя и пароля

  1. Настройте привязку, использующую безопасность сообщений с любым транспортом или безопасность на уровне транспорта по HTTP(S).

    При использовании системы безопасности сообщений добавьте одну из привязок, предоставляемых системой, например wsHttpBinding Element или customBinding Element, поддерживающих безопасность сообщений и тип учетных данных UserName.

    При использовании безопасности на уровне транспорта по протоколу HTTP(S) добавьте элемент wsHttpBinding Element, <basicHttpBinding>, <netTcpBinding> или customBinding Element, который использует протокол HTTP(S) и схему проверки подлинности Basic.

    Aa702565.note(ru-ru,VS.100).gifПримечание
    Если используется платформа .NET Framework, версия 3.5 или более поздняя версия, на уровне безопасности сообщений и транспорта можно применять пользовательский модуль проверки имени пользователя и пароля. Если используется платформа Платформа .NET Framework 3.0, пользовательский модуль проверки имени пользователя и пароля можно использовать только на уровне безопасности сообщений.

    Aa702565.Tip(ru-ru,VS.100).gifСовет.
    Дополнительные сведения об использовании привязки <netTcpBinding> в данном контексте см. в разделе <security> of <netTcpBinding>.

    1. Добавьте в раздел <system.ServiceModel> файла конфигурации элемент <bindings>.

    2. Добавьте элемент wsHttpBinding Element или <basicHttpBinding> в раздел привязок. Дополнительные сведения создании элемента привязки WCF см. в разделе Как задать привязку службы в конфигурации.

    3. Присвойте атрибуту mode элемента security element of wsHttpBinding или <security> of <basicHttpBinding> значение Message, Transport, or TransportWithMessageCredential.

    4. Задайте атрибут clientCredentialType элемента message element of wsHttpBinding или <transport> of <wsHttpBinding>.

      При использовании безопасности сообщений присвойте атрибуту clientCredentialType элемента message element of wsHttpBinding значение UserName.

      При использовании безопасности на уровне транспорта по HTTP(S) задайте для атрибута clientCredentialType элемента <transport> of <wsHttpBinding> или <transport> of <basicHttpBinding> значение Basic.

      Aa702565.note(ru-ru,VS.100).gifПримечание
      Если служба WCF размещена на сервере служб IIS, на котором используется безопасность на уровне транспорта, а свойству UserNamePasswordValidationMode присвоено значение Custom, в пользовательской схеме проверки подлинности используется подмножество возможностей проверки подлинности Windows. Это происходит потому, что в данном случае службы IIS выполняют проверку подлинности Windows перед вызовом службой WCF пользовательского модуля проверки подлинности.

    Дополнительные сведения создании элемента привязки WCF см. в разделе Как задать привязку службы в конфигурации.

    В следующем примере показан код конфигурации для привязки.

    <system.serviceModel> 
      <bindings>
      <wsHttpBinding>
          <binding name="Binding1">
            <security mode="Message">
              <message clientCredentialType="UserName" />
            </security>
          </binding>        
        </wsHttpBinding>
      </bindings>
    </system.serviceModel>
    
  2. Настройте поведение, которое будет указывать, что для проверки пар имени пользователя и пароля для входящих маркеров безопасности UserNameSecurityToken будет использоваться пользовательский проверяющий элемент управления.

    1. Добавьте элемент <behaviors> в качестве дочернего для элемента <system.serviceModel>.

    2. Добавьте элемент serviceBehaviors section в элемент <behaviors>.

    3. Добавьте элемент <behavior> и присвойте атрибуту name соответствующее значение.

    4. Добавьте элемент <serviceCredentials> Element в элемент <behavior>.

    5. Добавьте элемент userNameAuthentication element в элемент <serviceCredentials> Element.

    6. Присвойте свойству userNamePasswordValidationMode значение Custom.

      Aa702565.Important(ru-ru,VS.100).gif Примечание
      Если значение userNamePasswordValidationMode не задано, WCF использует проверку подлинности Windows вместо пользовательского проверяющего элемента управления для проверки имени пользователя и пароля.

    7. Присвойте атрибуту customUserNamePasswordValidatorType значение типа вашего пользовательского проверяющего элемента управления для проверки имени пользователя и пароля.

    В следующем примере показан фрагмент <serviceCredentials>, иллюстрирующий вышеуказанные действия.

    <serviceCredentials>
      <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Microsoft.ServiceModel.Samples.CalculatorService.CustomUserNameValidator, service" />
    </serviceCredentials>
    

Пример

В следующем примере кода показано, как создать пользовательский проверяющий элемент управления для проверки имени пользователя и пароля. Не используйте код, переопределяющий метод Validate, в производственной среде. Замените код на свою собственную схему проверки подлинности имени пользователя и пароля, в которой может применяться извлечение пар имени пользователя и пароля из базы данных.

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");
                }
            }
        }

См. также

Задачи

Как использовать поставщик членства ASP.NET

Справочник

UserNamePasswordValidator

Другие ресурсы

Проверка подлинности