Копировать ссылку на страницу

В разделе описан пример реализации встроенного провайдера аутентификации для сайта веб-доступа DIRECTUM. Провайдер можно будет выбрать в списке типов аутентификации на странице входа на сайт веб-доступа:

Встроенный (интегрированный) провайдер аутентификации – это класс, реализующий интерфейс IAuthenticationProvider(NpoComputer.WebAccess.Authentication.dll), который подключается к сайту веб-доступа через конфигурационный файл web.config в разделе npocomputer.authentication.

В веб-доступе DIRECTUM страница входа содержит три реквизита пользователя, по которым проводится аутентификация:

логин;
пароль;
область (realm). Например, для windows-аутентификации это домен.

Примечание

Если для аутентификации провайдеру необходимы дополнительные реквизиты, то страница входа на сайт веб-доступа должна быть соответствующе изменена. Например, если для аутентификации помимо логина, пароля и области необходим e-mail пользователя, то добавьте на страницу входа поле для ввода адреса электронной почты.

Схема работы провайдера аутентификации:

1.Метод SignIn класса провайдера принимает набор реквизитов пользователя со страницы входа в виде коллекции объектов класса UserCredential и возвращает идентификатор сессии.
2.Если аутентификация успешна, то данные пользователя могут быть получены при обращении к методу GetIdentity класса провайдера, передав в него идентификатор сессии.
3.Если аутентификация не успешна, то провайдер возвращает исключение AuthenticationException.

Для упрощения разработки провайдера можно использовать класс BaseAuthenticationProvider, который входит в сборку NpoComputer.WebAccess.Authentication.dll.

Чтобы разработать встроенный провайдер аутентификации:

1.Создайте новый проект Class Library и подключите к нему сборку NpoComputer.WebAccess.Authentication.dll.
2.Добавьте в проект класс ListAuthenticationProvider, который унаследован от класса BaseAuthenticationProvider.

 

Imports NpoComputer.WebAccess.Authentication
 
Public Class ListAuthenticationProvider
 Inherits BaseAuthenticationProvider
End Class

3.Добавим в класс реализацию методов SignIn и SignOut.

 

''' <summary>¶  ''' Осуществляет вход пользователя и возвращает ИД сессии.
''' </summary>¶
''' <param name="Credentials">Реквизиты пользователя, по которым осуществляется вход.</param>
''' <returns>ИД сессии пользователя.</returns>
''' <exception cref="AuthenticationException">Возникает в случае, если предоставленные реквизиты пользователя некорректны.</exception>
''' <remarks></remarks>
Public Overrides Function SignIn(Credentials As IEnumerable(Of UserCredential)) As Guid
  Dim Claims As List(Of Claim)
  Dim UserLogin As String = ""
  Dim UserPassword As String = ""
  Dim AreCredentialsValid As Boolean = False
 
  'Получить логин и пароль пользователя.
   GetUserLoginAndPasswordFromCredentials(Credentials, UserLogin, UserPassword)
 
  'Определить наличие пользователя в списке и корректность пароля.
  If FUsers.ContainsKey(UserLogin) AndAlso FUsers(UserLogin).Equals(UserPassword) Then
     AreCredentialsValid = True
  End If
 
  'Если реквизиты заданы некорректно, то вернуть исключение.
  If Not AreCredentialsValid Then
     Throw New InvalidUserCredentialsException()
  End If
 
  'Создать набор утверждений (claims) для аутентификации пользователя.
   Claims = New List(Of Claim)
   Claims.Add(New Claim(ClaimTypes.AuthenticationMethod, AuthenticationMethods.Password))
   Claims.Add(New Claim(ClaimTypes.Name, UserLogin))
   Claims.Add(New Claim(ExtendedClaimTypes.Secret, UserPassword))
 
  'Создать сессию пользователя.
  Dim Identity As New ClaimsIdentity(Claims)
  Dim Principal = New ClaimsPrincipal(Identity)
  Return AddSession(Principal)
End Function
''' <summary>
''' Осуществляет выход пользователя.
''' </summary>
''' <param name="SessionId">ИД сессии пользователя, полученный из метода SingIn.</param>
''' <remarks>После вызова данного метода ИД сессии, полученный ранее, становится недействительным.</remarks>
Public Overrides Sub SignOut(SessionId As Guid)
  'Удалить сессию пользователя.
  Dim Principal As ClaimsPrincipal = RemoveSession(SessionId)
End Sub
 
''' <summary>
''' Возвращает имя пользователя и пароль из реквизитов.
''' </summary>
''' <param name="Credentials">Реквизиты пользователя.</param>
''' <param name="UserName">Логин пользователя.</param>
''' <param name="UserPassword">Пароль пользователя.</param>
''' <remarks></remarks>
Private Sub GetUserLoginAndPasswordFromCredentials(ByVal Credentials As IEnumerable(Of UserCredential), ByRef UserName As String, ByRef UserPassword As String)
  'FUsers – некоторая коллекция, которая содержит логин и пароль пользователя.
  'Извлечь реквизиты (логин, пароль).
  For Each Credential As UserCredential In Credentials
    Select Case Credential.Type
      Case UserCredentialType.Name
         UserName = Credential.Value
      Case UserCredentialType.Password
         UserPassword = Credential.Value
    End Select
  Next
 
  'Если логин не найден, то вернуть исключение.
  If String.IsNullOrEmpty(UserName) Then
     Throw New InvalidUserCredentialsException()
  End If
End Sub

4.Подключите провайдер к веб-доступу:
a)Откройте файл web.config. Файл расположен в корневом каталоге веб-сайта. По умолчанию «C:\Inetpub\wwwroot\<Веб-сайт>\».
b)В секцию npocomputer.authentication добавьте описание провайдера:

 

<provider name="list" displayname="AUTHPROVIDER_LIST" type="ListAuthenticationProvider.ListAuthenticationProvider, ListAuthenticationProvider">
</provider>

© 2016 Компания DIRECTUM Сообщество пользователей DIRECTUM