Kei*_*ith 6 .net saml x509certificate single-sign-on pkcs#7
我正在尝试在.Net中实现SAML SSO解决方案,但我在解析断言时遇到问题.
我有一个示例断言(看起来像byte[]数据作为文本)和相应的.p7b文件.
我想从中加载密钥.p7b并将断言解密为XML文档.
到目前为止,我认为我正在正确读取键:
// get the key data
byte[] certificateData = System.IO.File.ReadAllBytes("myKeys.p7b");
// decode the keys
var cms = new SignedCms(SubjectIdentifierType.IssuerAndSerialNumber);
cms.Decode(certificateData);
var samlCertificates = cms.Certificates;
Run Code Online (Sandbox Code Playgroud)
然后我尝试解析我遇到问题的断言:
// we have a keychain of X509Certificate2s, we need a collection of tokens
var certificatesAsTokens =
from X509Certificate2 cert in samlCertificates
select new X509SecurityToken(cert) as SecurityToken;
// get a token resolver
var tokens = new ReadOnlyCollection<SecurityToken>(
certificatesAsTokens.ToList());
var resolver = SecurityTokenResolver.CreateDefaultSecurityTokenResolver(
tokens, true);
// get the SAML data in an XML reader
var reader = XmlReader.Create(assertionPostStream);
// use the WS Security stuff to parse the reader
var securityToken = WSSecurityTokenSerializer.
DefaultInstance.ReadToken(reader, resolver) as SamlSecurityToken;
Run Code Online (Sandbox Code Playgroud)
最后一个语句抛出异常,声明它无法解析XML内容.
我认为这意味着我错过了解密断言的步骤 - 将byte[]as文本转换为SAML格式的XML文档.
有谁知道如何添加这一步?我错过了别的什么吗?
Kei*_*ith 14
我已经弄明白了 - 我错过了SAML规范的一部分.
断言被发送(相当奇怪,因为它没有加密)作为base64数据,并且它被发送的URL编码两次.
所以添加这个步骤给了我们一个有效的断言:
// spec says "SAMLResponse="
string rawSamlData = Request["SAMLResponse"];
// the sample data sent us may be already encoded,
// which results in double encoding
if (rawSamlData.Contains('%'))
{
rawSamlData = HttpUtility.UrlDecode(rawSamlData);
}
// read the base64 encoded bytes
byte[] samlData = Convert.FromBase64String(rawSamlData);
// read back into a UTF string
string samlAssertion = Encoding.UTF8.GetString(samlData);
Run Code Online (Sandbox Code Playgroud)
该认证仍无法工作的,但是我现在有有效的XML所以这是一个不同的问题.
| 归档时间: |
|
| 查看次数: |
17407 次 |
| 最近记录: |