Утверждение (Claim)
Единица информации о пользователе, использующаяся для его идентификации на сайте, например, имя, фамилия, право на выполнение определенных действий. Используется для создания токена безопасности.
Для подключения внешнего провайдера аутентификации к веб-доступу необходимо создать HTTP-модуль, который содержит обработчик события AuthenticateRequest. Функция обработчика получает реквизиты пользователя, передаваемые провайдером, и на их основе создает объект класса ClaimsIdentity.
Объект класса ClaimsIdentity содержит ряд утверждений (claim), описывающих пользователя, например, логин и пароль. Список утверждений зависит от применяемого типа аутентификации в DIRECTUM (не путать с аутентификацией у провайдера):
• | для аутентификации по паролю в списке утверждений передается логин пользователя и пароль; |
• | для windows-аутентификации в списке утверждений передается логин пользователя и домен либо токен безопасности (UPN). |
Для реализации внутренней аутентификации веб-доступ поддерживает следующий список утверждений:
Утверждение |
Значение |
---|---|
Метод внутренней аутентификации |
http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod |
Метод для windows-аутентификации; |
http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/windows и urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport |
Метод для аутентификации по паролю |
http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password |
Метод для Novell-аутентификации |
http://schemas.npo.comp/ws/2015/identity/authenticationmethod/novell |
Имя (логин) пользователя |
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name или http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier |
Имя участника, предоставляющего токен безопасности (UPN) |
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn |
Область размещения пользователя (домен) |
http://schemas.npo.comp/ws/2015/identity/claims/realm |
Секретная информация от пользователя, например, пароль |
http://schemas.npo.comp/ws/2015/identity/claims/secret |
Обязательным утверждением для любого типа аутентификации является утверждение, которое определяет тип внутренней аутентификации: http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod.
Постановка задачи
Внешний провайдер аутентификации в cookie MyCustomIdP_UserCredentials возвращает данные пользователя в формате:
«ТипАутентификации,ЛогинПользователя,ПарольПользователя»
Необходимо создать HTTP-модуль, который обеспечивает интерфейс между провайдером аутентификации и сайтом веб-доступа.
Программный код
Imports System.Security.Principal
Imports System.Text.RegularExpressions
Imports System.Threading
Imports System.Web
Imports System.Text
Imports System.Security.Claims
Imports System.Configuration
Imports System.IdentityModel.Tokens
Public Class MyIdPAuthenticationModule
Implements IHttpModule
''' <summary>
''' Освобождение ресурсов.
''' </summary>
''' <remarks></remarks>
Public Sub Dispose() Implements IHttpModule.Dispose
End Sub
''' <summary>
''' Инициализация.
''' </summary>
''' <param name="context"></param>
''' <remarks></remarks>
Public Sub Init(context As HttpApplication) Implements IHttpModule.Init
AddHandler context.AuthenticateRequest, AddressOf OnAuthentication
End Sub
''' <summary>
''' Обработчик события аутентификации.
''' </summary>
''' <param name="Source"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Public Sub OnAuthentication(Source As Object, e As EventArgs)
Dim Application As HttpApplication = CType(Source, HttpApplication)
Dim Request As HttpRequest = Application.Context.Request
Dim Certificate As HttpClientCertificate = Request.ClientCertificate
Dim Claims As New List(Of Claim)
Try
If HttpContext.Current IsNot Nothing Then
If HttpContext.Current.User Is Nothing OrElse Not HttpContext.Current.User.Identity.IsAuthenticated Then
Dim AuthCookie As HttpCookie = HttpContext.Current.Request.Cookies("MyCustomIdP_UserCredentials")
If AuthCookie IsNot Nothing Then
'Извлечь реквизиты пользователя из cookie.
Dim UserCredentials As String() = AuthCookie.Value.Split(","c)
'Заполнить список утверждений по предоставленным реквизитам
'пользователя.
Claims.Add(New Claim("http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod", AuthenticationMethods.Password))
Claims.Add(New Claim(ClaimTypes.Name, UserCredentials(1)))
Claims.Add(New Claim("http://schemas.npo.comp/ws/2015/identity/claims/secret", UserCredentials(2)))
'Создать объект идентификации пользователя.
Dim Identity As New ClaimsIdentity(Claims, "MyIdPIdentityKey")
'Создать объект участника контекста безопасности.
Dim Principal = New ClaimsPrincipal(Identity)
'Установить объект участника контекста в HTTP-контексте.
HttpContext.Current.User = CType(Principal, IPrincipal)
Application.Context.User = CType(Principal, IPrincipal)
Thread.CurrentPrincipal = CType(Principal, IPrincipal)
End If
End If
End If
Catch ex As Exception
'TODO: Обработать исключения
End Try
End Sub
End Class
Подключите HTTP-модуль к веб-доступу:
1. | Откройте файл web.config в корневой папке веб-сайта. По умолчанию «C:\Inetpub\wwwroot\<Веб-сайт>\». |
2. | В секцию modules или httpModules добавьте описание провайдера. Название секции зависит от режима пула приложений: httpModules для классического режима, modules для интегрированного режима. |
<add type="MyIdPAuthenticationModule.MyIdPAuthenticationModule, MyIdPAuthenticationModule" name="MyIdPAuthenticationModule" />
Результат
Пользователь аутентифицируется на странице внешнего провайдера и перенаправляется на сайт веб-доступа. HTTP-модуль извлекает токен безопасности пользователя и по нему создает объект класса ClaimsIdentity, который используется веб-доступом для проведения внутренней аутентификации.
© Компания DIRECTUM, 2018 | Сообщество пользователей DIRECTUM |