Dot-Net

如何在 .Net 中解析 SAML 斷言請求

  • September 25, 2014

我正在嘗試在 .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;

然後我嘗試解析我遇到問題的斷言:

// 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 內容。

我認為這意味著我錯過了解密斷言的步驟 - 將byte[]as 文本轉換為 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,所以這是一個不同的問題。

引用自:https://stackoverflow.com/questions/6099467