Копировать ссылку на страницу Перейти в предыдущий раздел Перейти в следующий раздел

Утверждение (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
.navbar > a:hover { background: #FFD73B; }