我有一个SAML断言,我希望用WSSecurityTokenSerializer
在.NET来验证。
我已经拿到了钥匙链和SAML XML,尽管a few issues。
首先我从HTTPS POST SAML断言:
// spec says "SAMLResponse="
string rawSamlData = Request["SAMLResponse"];
// read the base64 encoded bytes
byte[] samlData = Convert.FromBase64String(rawSamlData);
// read back into a UTF string
string samlAssertion = Encoding.UTF8.GetString(samlData);
// get the SAML data in an XML reader
var assertionPostStream = new StringReader(samlAssertion);
var reader = XmlReader.Create(assertionPostStream);
然后我得到我的IdP提供的密钥:
// get the key data
byte[] certificateData = System.IO.File.ReadAllBytes("myKeys.p7b");
// decode the keys
var cms = new SignedCms(SubjectIdentifierType.IssuerAndSerialNumber);
cms.Decode(certificateData);
// we have a keychain of X509Certificate2s, we need a collection of tokens
var certificatesAsTokens =
from X509Certificate2 cert in cms.Certificates
select new X509SecurityToken(cert) as SecurityToken;
// get a token resolver
var tokens = new ReadOnlyCollection<SecurityToken>(
certificatesAsTokens.ToList());
var resolver = SecurityTokenResolver.CreateDefaultSecurityTokenResolver(
tokens, true);
最后,我来到这里抛出一个错误:
// use the WS Security stuff to parse the reader
var securityToken = WSSecurityTokenSerializer.
DefaultInstance.ReadToken(reader, resolver) as SamlSecurityToken;
当我们调用了ReadToken
我得到以下错误:
不能与读取从“响应”元素令牌“瓮:绿洲:名称:TC:SAML:2.0:协议”的命名空间BinarySecretSecurityToken,具有“”值类型。如果该元件被预期是有效的,确保安全性被配置成消耗与指定的名称,命名空间和值类型令牌。
我SAML XML开头:
<Response xmlns="urn:oasis:names:tc:SAML:2.0:protocol" ...
所以很明显我在Response
命名空间的urn:oasis:names:tc:SAML:2.0:protocol
元素。
任何想法有什么错/丢失在这里吗?
它看起来像您收到一个SAML2响应。尽管在.NET 4.5 SAML2支持,有不幸仅用于断言支持 - 不协议本身(包括响应消息)。
为了处理在.NET中,你必须在SAML2响应:
Saml2SecurityTokenHandler.ReadToken()
令牌。Saml2SecurityTokenHandler.DetectReplayedToken()
令牌。Saml2SecurityTokenHandler.ValidateConditions()
令牌Saml2SecurityTokenHandler.CreateClaims()
创建声明身份。不幸的是大多数的这些方法是受保护的,但你也可以继承Saml2SecurityTokenHandler
并获得对它们的访问。
一个完整的工作示例可以在Saml2Response项目Sustainsys.Saml2类中找到。