【发布时间】:2011-08-31 19:14:44
【问题描述】:
我有一个 SAML 断言,我希望使用 WSSecurityTokenSerializer 在 .Net 中进行身份验证。
尽管有a few issues,但我有钥匙链和 SAML XML。
首先我从 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 时出现以下错误:
无法从带有“urn:oasis:names:tc:SAML:2.0:protocol”命名空间的 BinarySecretSecurityToken 和“ValueType”的“Response”元素中读取令牌。如果此元素预计有效,请确保将安全性配置为使用指定名称、命名空间和值类型的令牌。
我的 SAML XML 开头为:
<Response xmlns="urn:oasis:names:tc:SAML:2.0:protocol" ...
很明显我在urn:oasis:names:tc:SAML:2.0:protocol 命名空间中有一个Response 元素。
知道这里出了什么问题/遗漏了什么吗?
【问题讨论】:
-
经过几天的挖掘(关于这些东西的文档很糟糕)我认为这可能是由于
WSSecurityTokenSerializer依赖于 SAML 1.1 的变体而不是 SAML 2.0 - 我已经转而尝试直接验证签名:stackoverflow.com/questions/6126388
标签: .net single-sign-on x509certificate pkcs#7 saml-2.0