2011-05-10 56 views
1

我有一個基於Web的應用程序,其中使用SAML(作爲服務提供商)的SSO已實施。 它涉及數字簽名驗證。如果在XML響應中沒有unicode字符(如'ü')發佈到系統中,則以下代碼可以正常工作。SSO SAML數字簽名驗證 - XML unicode字符

但是,對於UNICODE字符,它在將XML加載到XMLDocument類時引發異常。如果我將XML響應保存在使用Unicode格式的記事本文件中,並讀取數字簽名驗證的相同內容,那麼事情工作正常。我需要在C#實現中使用記事本手動步驟。

以下是我正在使用的代碼。

if (m_b64SamlResponse == null || m_b64SamlResponse == string.Empty) 
return "SAMLResponse null or empty"; 
string xml = Decode(m_b64SamlResponse); 

m_xmlDoc = new XmlDocument(); 
m_xmlDoc.PreserveWhitespace = true; 

m_xmlDoc.LoadXml(xml); 

XmlNamespaceManager nsm = new XmlNamespaceManager(new NameTable()); 
nsm.AddNamespace("dsig", SignedXml.XmlDsigNamespaceUrl); 
XmlElement sigElt = (XmlElement)xd.SelectSingleNode(
"//dsig:Signature", nsm); 
// Load the signature for verification 
SignedXml sig = new SignedXml(m_xmlDoc); 
sig.LoadXml(sigElt); 
if (!sig.CheckSignature()) 
return "Invalid Signature"; 
else 
return "Valid Signature"; 

回答

1

這可以通過以下事實SAML文檔通常不包含經典的XML頭<?XML版本= 「1.0」 編碼= 「UTF-8」 引起的? >

你是否試圖強制編碼爲UTF-8?

你可以嘗試與此示例類似的東西:

string xml = Decode(m_b64SamlResponse); 

byte[] xmlUTF8 = Encoding.UTF8.GetBytes(xml); 

MemoryStream ms = new MemoryStream(encodedString); 
ms.Flush(); 
ms.Position = 0; 

m_xmlDoc = new XmlDocument(); 
m_xmlDoc.PreserveWhitespace = true; 

m_xmlDoc.Load(ms);