如何从 SamlSecurityToken 读取声明
How to read claims from 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
.
中提取完整的索赔列表
到目前为止,阅读这些声明的最简单方法是使用 Saml2SecurityTokenHandler
的 built-in Validate 方法。这会将您的安全令牌转换为 ClaimsIdentity
objects 的列表(通常是 1 元素列表),这又是
有一个 Claims
collection。从头开始配置这样的处理程序可能是一个挑战。因此,您可以只使用用于读取令牌的方法。在
上调用 ValidateToken
FederatedAuthentication
.FederationConfiguration.IdentityConfiguration
.SecurityTokenHandlers.ValidateToken()
得到相同的结果。 Validate
方法这个转换的名字有点怪,让人搜索
我通过代码在 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
.
到目前为止,阅读这些声明的最简单方法是使用 Saml2SecurityTokenHandler
的 built-in Validate 方法。这会将您的安全令牌转换为 ClaimsIdentity
objects 的列表(通常是 1 元素列表),这又是
有一个 Claims
collection。从头开始配置这样的处理程序可能是一个挑战。因此,您可以只使用用于读取令牌的方法。在
ValidateToken
FederatedAuthentication
.FederationConfiguration.IdentityConfiguration
.SecurityTokenHandlers.ValidateToken()
得到相同的结果。 Validate
方法这个转换的名字有点怪,让人搜索