#c# #single-sign-on #saml #saml-2.0
#c# #единый вход #saml #saml-2.0
Вопрос:
Разве подпись SAML не должна быть всегда <ds:Signature ></ds:Signature>
… Я заметил некоторое использование Idp <Signature>
и некоторое использование <ds:Signature>
В C # я пытаюсь получить узел подписи, используя.
XmlNodeList nodeList = samlDoc.GetElementsByTagName("ds:Signature");
Сбой происходит, когда тег подписи начинается с <Signature>
ds:
префикса without. Есть ли что-нибудь, чего мне здесь не хватает?
Комментарии:
1. Вам нужно разобраться с
ds:
пространством имен. Не знаком с C #, но похоже, с чего вам следует начать: docs.microsoft.com/en-us/dotnet/standard/data/xml /…
Ответ №1:
Нет. Нет необходимости использовать ds в качестве префикса. Существуют определенные соглашения, которым следует большинство реализаций Java, использующих префикс ds, но .NET framework этого не делает. Кто-то может использовать xyz в качестве префикса, если он решит это сделать.
Важно имя элемента (подпись) и пространство имен, в котором оно объявлено (http://www.w3.org/2000/09/xmldsig #). Вы не должны делать никаких предположений о префиксе. Выберите узел на основе имени элемента и пространства имен и полностью игнорируйте префикс.
Ответ №2:
Нет, его не должно быть там, если он упоминается в пространстве имен над элементом, например:
<samlp:Response xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
...>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
...
</Signature>
</samlp:Response>
Ответ №3:
Спасибо, Эндрю, ComponentSpace и Яркову за ответы, подчеркивающие важность пространства имен. Я использовал XmlNamespaceManager
System.XML
сборку from для получения значения подписи.
XmlNamespaceManager manager = new XmlNamespaceManager(samlDoc.NameTable);
manager.AddNamespace("ds", SignedXml.XmlDsigNamespaceUrl);
manager.AddNamespace("saml", "urn:oasis:names:tc:SAML:2.0:assertion");
manager.AddNamespace("samlp", "urn:oasis:names:tc:SAML:2.0:protocol");
XmlNodeList nodeList = samlDoc.SelectNodes("//ds:Signature", manager);