2016-10-12 18 views
0

Я аутентифицировать на ADFS из кода и получить расшифрованный SamlSecurityToken:Как читать претензии от SamlSecurityToken

var factory = new WSTrustChannelFactory(
    new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), 
    "https://my-adfs-domain.com/adfs/services/trust/13/UserNameMixed") 
{ 
    TrustVersion = System.ServiceModel.Security.TrustVersion.WSTrust13, 
    Credentials = 
    { 
     UserName = 
     { 
      UserName = "username", 
      Password = "password" 
     } 
    } 
}; 

var token = (GenericXmlSecurityToken)factory.CreateChannel().Issue(
    new RequestSecurityToken 
    { 
     RequestType = RequestTypes.Issue, 
     AppliesTo = new EndpointAddress("https://my-service-domain.com"), 
     KeyType = KeyTypes.Symmetric, 
     RequestDisplayToken = true 
    }); 

SamlSecurityToken decryptedToken; 

using (var stream = new MemoryStream()) 
{ 
    using (var writer = XmlWriter.Create(stream)) 
     token.TokenXml.WriteTo(writer); 

    stream.Seek(0, SeekOrigin.Begin); 

    using (var reader = XmlReader.Create(stream)) 
     decryptedToken = (SamlSecurityToken)FederatedAuthentication 
      .FederationConfiguration.IdentityConfiguration 
      .SecurityTokenHandlers.ReadToken(reader); 
} 

var userEmail = decryptedToken.Assertion.Statements 
    .OfType<SamlAttributeStatement>().Single() 
    .Attributes[0].AttributeValues[0]; 

В качестве следующего шага я собираюсь прочитать требования (например, электронная почту пользователей) от выпущенных маркеров.

Я могу извлечь часть соответствующей информации по вышеуказанному коду.

Однако я ищу более простой и безопасный способ извлечения полного списка претензий из выданного SamlSecurityToken.

ответ

2

На сегодняшний день самым простым способом прочитать эти претензии является использование встроенного метода Validate объекта Saml2SecurityTokenHandler. Это преобразует ваш токен безопасности в список (как правило, 1-элементный список) объектов ClaimsIdentity, которые, в свою очередь, имеют коллекцию Claims. Настройка такого обработчика с нуля может быть проблемой. Поэтому вы можете просто использовать метод, используемый для чтения токена. Вызовите ValidateToken on FederatedAuthentication .FederationConfiguration.IdentityConfiguration .SecurityTokenHandlers.ValidateToken(), чтобы получить тот же результат. Метод Validate - это немного странное имя для этого конвертирования, что заставляет его искать его.