如何在.Net中解析SAML断言请求

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所以这是一个不同的问题.

  • 感谢您发布如何使用它.它只是为我节省了很多时间. (2认同)