如何从SamlSecurityToken读取声明

本文关键字:读取 声明 SamlSecurityToken | 更新日期: 2023-09-27 18:12:45

我从代码中验证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中提取完整的索赔列表。

如何从SamlSecurityToken读取声明

到目前为止,读取这些声明的最简单方法是使用Saml2SecurityTokenHandler的内置Validate方法。这将把您的安全令牌转换为ClaimsIdentity对象的列表(通常是一个包含1个元素的列表)我有一个Claims的收藏。从头配置这样的处理程序可能是一个挑战。因此,您可以使用用于读取令牌的方法。调用

上的ValidateToken
FederatedAuthentication
    .FederationConfiguration.IdentityConfiguration
    .SecurityTokenHandlers.ValidateToken()

得到相同的结果。Validate方法是这个转换的一个有点奇怪的名字,这使得人们搜索它。