2011-05-23 43 views
5

我試圖在.Net中實現SAML SSO解決方案,但解析斷言時出現問題。如何解析.Net中的SAML斷言請求

我有一個示例斷言(看起來像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[]作爲文本轉換爲SAML格式的XML文檔。

任何人都知道如何添加此步驟?我錯過了別的嗎?

回答

12

我已經想通了 - 我缺少部分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); 

authentication still isn't working,但是我現在有有效的XML所以這是一個不同的問題。

+2

感謝張貼你如何工作。它爲我節省了很多時間。 – 2013-09-06 12:38:08