Стандарт имени тега подписи SAML

#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);