В разделе описан пример реализации встроенного провайдера аутентификации для сайта веб-доступа 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>
© Компания DIRECTUM, 2018 | Сообщество пользователей DIRECTUM |