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

|| 我正在尝试在.Net中实现SAML SSO解决方案,但是在解析断言时遇到了问题。 我有一个示例断言(看起来像“ 0”数据作为文本)和相应的“ 1”文件。 我想从“ 1”加载密钥,并将断言解密为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;
然后我尝试解析断言我遇到了一个问题:
// 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;
最后一条语句引发异常,表明它无法解析XML内容。 我认为这意味着我缺少解密该断言的步骤-将“ 0”作为文本转换为SAML格式的XML文档。 有人知道如何添加此步骤吗?我还有其他东西吗?     
已邀请:
我已经弄清楚了-我缺少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);
身份验证仍然无法进行,但是我现在拥有有效的XML,所以这是一个不同的问题。     

要回复问题请先登录注册