Как использовать пользовательский проверяющий элемент управления для имени пользователя и пароля
Когда для проверки подлинности используются имя пользователя и пароль, по умолчанию Windows Communication Foundation (WCF) использует Windows для проверки имени пользователя и пароля. Однако WCF позволяет применение пользовательских схем проверки подлинности имени пользователя и пароля, которые также известны как проверяющие элементы управления. Чтобы внедрить пользовательский проверяющий элемент управления для проверки подлинности имени пользователя и пароля, необходимо создать класс, унаследованный от класса UserNamePasswordValidator, и настроить его.
Пример приложения см. в разделе Проверяющий элемент управления для имен пользователей и паролей.
Создание пользовательского проверяющего элемента управления для имени пользователя и пароля
Создайте класс, наследующий от класса UserNamePasswordValidator.
Public Class CustomUserNameValidator Inherits UserNamePasswordValidator
public class CustomUserNameValidator : UserNamePasswordValidator {
Реализуйте пользовательскую схему проверки подлинности, переопределив метод 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"); } }
Настройка службы для использования пользовательского проверяющего элемента управления для проверки имени пользователя и пароля
Настройте привязку, использующую безопасность сообщений с любым транспортом или безопасность на уровне транспорта по HTTP(S).
При использовании системы безопасности сообщений добавьте одну из привязок, предоставляемых системой, например wsHttpBinding Element или customBinding Element, поддерживающих безопасность сообщений и тип учетных данных UserName.
При использовании безопасности на уровне транспорта по протоколу HTTP(S) добавьте элемент wsHttpBinding Element, <basicHttpBinding>, <netTcpBinding> или customBinding Element, который использует протокол HTTP(S) и схему проверки подлинности Basic.
Примечание
Если используется платформа .NET Framework, версия 3.5 или более поздняя версия, на уровне безопасности сообщений и транспорта можно применять пользовательский модуль проверки имени пользователя и пароля. Если используется платформа Платформа .NET Framework 3.0, пользовательский модуль проверки имени пользователя и пароля можно использовать только на уровне безопасности сообщений. Совет.
Дополнительные сведения об использовании привязки <netTcpBinding> в данном контексте см. в разделе <security> of <netTcpBinding>. Добавьте в раздел <system.ServiceModel> файла конфигурации элемент <bindings>.
Добавьте элемент wsHttpBinding Element или <basicHttpBinding> в раздел привязок. Дополнительные сведения создании элемента привязки WCF см. в разделе Как задать привязку службы в конфигурации.
Присвойте атрибуту mode элемента security element of wsHttpBinding или <security> of <basicHttpBinding> значение Message, Transport, or TransportWithMessageCredential.
Задайте атрибут clientCredentialType элемента message element of wsHttpBinding или <transport> of <wsHttpBinding>.
При использовании безопасности сообщений присвойте атрибуту clientCredentialType элемента message element of wsHttpBinding значение UserName.
При использовании безопасности на уровне транспорта по HTTP(S) задайте для атрибута clientCredentialType элемента <transport> of <wsHttpBinding> или <transport> of <basicHttpBinding> значение Basic.
Примечание
Если служба 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>
Настройте поведение, которое будет указывать, что для проверки пар имени пользователя и пароля для входящих маркеров безопасности UserNameSecurityToken будет использоваться пользовательский проверяющий элемент управления.
Добавьте элемент <behaviors> в качестве дочернего для элемента <system.serviceModel>.
Добавьте элемент serviceBehaviors section в элемент <behaviors>.
Добавьте элемент <behavior> и присвойте атрибуту name соответствующее значение.
Добавьте элемент <serviceCredentials> Element в элемент <behavior>.
Добавьте элемент userNameAuthentication element в элемент <serviceCredentials> Element.
Присвойте свойству userNamePasswordValidationMode значение Custom.
Примечание
Если значение userNamePasswordValidationMode не задано, WCF использует проверку подлинности Windows вместо пользовательского проверяющего элемента управления для проверки имени пользователя и пароля. Присвойте атрибуту 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