Для добавления настраиваемого обработчика маркеров безопасности
достаточно создать класс, производный от класса SecurityTokenHandler
или одного из его потомков, и добавить созданный класс в файл
web.config
или app.config
для
используемого приложения. Следует иметь в виду, что если требуется
создать настраиваемый обработчик для маркеров безопасности
известного типа, такого как SAML 2 или X.509, необходимо создать
класс, производный от соответствующего класса WIF. Например, для
обработки маркеров SAML 2 необходим класс, производный от
Saml2SecurityTokenHandler. В данном разделе показано, как
добавить настраиваемый обработчик маркеров безопасности,
реализующий настраиваемую проверку имени пользователя и пароля.
Вначале создайте класс, производный от UserNameSecurityTokenHandler и переопределяющий методы CanValidateToken и ValidateToken.
Копировать код | |
---|---|
using Microsoft.IdentityModel.SecurityTokenService; using Microsoft.IdentityModel.Tokens; namespace SimpleCustomSecurityTokenHandler { public class CustomUserNamePasswordValidatorSecurityTokenHandler : UserNameSecurityTokenHandler { /* Внимание: необходимо переопределить CanValidateToken и получить true, иначе обработчик не будет действовать. */ public override bool CanValidateToken { get { return true; } } public override ClaimsIdentityCollection ValidateToken(SecurityToken token) { if (token == null) { throw new ArgumentNullException(); } UserNameSecurityToken UNtoken = token as UserNameSecurityToken; if (UNtoken == null) { throw new SecurityTokenException("Invalid token"); } /* Проверка значений UNtoken.UserName и UNtoken.Password. */ Claim claim = new Claim(System.IdentityModel.Claims.ClaimTypes.Name, UNtoken.UserName); IClaimsIdentity identity = new ClaimsIdentity(nameClaim,"Password"); identity.Claims.Add( new Claim("http://schemas.microsoft.com/ws/2008/06/identity/claims/ClaimTypes.AuthenticationInstant", XmlConvert.ToString(DateTime.UtcNow, "yyyy-MM-ddTHH:mm:ss.fffZ"), "http://www.w3.org/2001/XMLSchema#dateTime") ); identity.Claims.Add( new Claim("http://schemas.microsoft.com/ws/2008/06/identity/claims/ClaimTypes.AuthenticationMethod", "http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password") ); return new ClaimsIdentityCollection(new IClaimsIdentity[] { identity }); } } } |
Затем добавьте настраиваемый обработчик маркеров в
конфигурацию службы, добавив в раздел configuration
файла app.config
службы следующие коды разметки.
Копировать код | |
---|---|
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <!-- Регистрация раздела конфигурации microsoft.IdentityModel --> <section name="microsoft.identityModel" type="Microsoft.IdentityModel.Configuration.MicrosoftIdentityModelSection, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </configSections> <microsoft.identityModel> <service> <securityTokenHandlers> <remove type="Microsoft.IdentityModel.Tokens.WindowsUserNameSecurityTokenHandler, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add type="SimpleCustomSecurityTokenHandler.CustomUserNamePasswordValidatorSecurityTokenHandler, SimpleCustomSecurityTokenHandler"/> </securityTokenHandlers> </service> </microsoft.identityModel> </configuration> |
Обратите внимание, что здесь не только добавляется
новый настраиваемый обработчик маркеров безопасности
CustomUserNamePasswordValidatorSecurityTokenHandler
,
но и удаляется используемый по умолчанию обработчик маркеров
безопасности
WindowsUserNameSecurityTokenHandler для имени пользователя и
пароля. Это делается потому, что коллекция обработчиков маркеров
WIF будет по умолчанию содержать только один обработчик для каждого
типа маркера. Между обработчиками маркеров и типами маркеров
существует взаимно однозначное соответствие, поэтому не следует
создавать настраиваемый обработчик маркеров для нескольких типов
маркеров. Каждый тип маркера может быть представлен одной или
несколькими строками идентификаторов маркеров, так что можно
создать настраиваемый обработчик для обработки одного типа маркера
и нескольких идентификаторов маркеров.
Если созданный обработчик маркеров безопасности переопределяет метод ReadToken, он должен также переопределять метод CanReadToken. Аналогично, если обработчик переопределяет метод WriteToken, он должен также переопределять метод CanWriteToken.