2016-10-12 4 views
0

에서 주장을 읽고 SamlSecurityToken 해독하는 방법을 : 나는 발급 된 토큰 클레임 (예를 들어, 사용자 이메일)을 읽는거야 다음 단계로내가 코드에서 ADFS에서 인증 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

이러한 주장을 읽는 가장 쉬운 방법은 Saml2SecurityTokenHandler에 내장 된 Validate 메서드를 사용하는 것입니다. 이렇게하면 보안 토큰이 ClaimsIdentity 개체 목록 (일반적으로 1 요소 목록)으로 변환되며 차례로 에 클레임 컬렉션이 있습니다. 이러한 핸들러를 처음부터 구성하는 것은 어려울 수 있습니다. 따라서 토큰을 읽는 데 사용한 방법을 사용할 수 있습니다. 동일한 결과를 얻으려면 FederatedAuthentication ValidateToken을 .FederationConfiguration.IdentityConfiguration .SecurityTokenHandlers.ValidateToken()으로 호출하십시오. Validate 메서드는이 변환에 대한 이상한 이름으로 사람이 검색합니다.