SSO SAML проверка цифровой подписи - символ Unicode XML - PullRequest
1 голос
/ 10 мая 2011

У меня есть веб-приложение, в котором реализован SSO с использованием SAML (в качестве поставщика услуг). Это включает проверку цифровой подписи. Все работает нормально с помощью следующего кода, если в ответе XML, отправляемом в систему, нет символа юникода, такого как «ü».

Но с символом 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 Ответ

1 голос
/ 04 сентября 2011

Это может быть вызвано тем, что документы SAML часто не содержат классический заголовок xml <? Xml version = "1.0" encoding = "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);
...