Dot-Net
如何在 .Net 中解析 SAML 斷言請求
我正在嘗試在 .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,所以這是一個不同的問題。