Подтвердить что ты не робот

Работа с SAML 2.0 в С#.NET 4.5

Я пытаюсь использовать чистый .NET(без внешних классов, элементов управления, помощников) для создания сообщения SAML. Я нашел код на сетях; это то, что у меня есть:

private static SamlAssertion createSamlAssertion()
{
    // Here we create some SAML assertion with ID and Issuer name. 
    SamlAssertion assertion = new SamlAssertion();
    assertion.AssertionId = "AssertionID";
    assertion.Issuer = "ISSUER";
    // Create some SAML subject. 
   SamlSubject samlSubject = new SamlSubject();
    samlSubject.Name = "My Subject";

    // 
    // Create one SAML attribute with few values. 
    SamlAttribute attr = new SamlAttribute();
    attr.Namespace = "http://daenet.eu/saml";
    attr.AttributeValues.Add("Some Value 1");
    //attr.AttributeValues.Add("Some Value 2");

    attr.Name = "My ATTR Value";

    // 
    // Now create the SAML statement containing one attribute and one subject. 
    SamlAttributeStatement samlAttributeStatement = new SamlAttributeStatement();
    samlAttributeStatement.Attributes.Add(attr);
    samlAttributeStatement.SamlSubject = samlSubject;

    // Append the statement to the SAML assertion. 
    assertion.Statements.Add(samlAttributeStatement);

    //return assertion
    return assertion;

}

и вот код, который я использую для получения XML:

var sb = new StringBuilder();
var settings = new XmlWriterSettings
{
    OmitXmlDeclaration = true,
    Encoding = Encoding.UTF8
};
using (var stringWriter = new StringWriter(sb))
using (var xmlWriter = XmlWriter.Create(stringWriter, settings))
using (var dictionaryWriter = XmlDictionaryWriter.CreateDictionaryWriter(xmlWriter))
{
    var samlAssertSerializer = new SamlSerializer();
    var secTokenSerializer = new WSSecurityTokenSerializer();
    assertion.WriteXml(
        dictionaryWriter,
        samlAssertSerializer,
        secTokenSerializer
    );
}

Казалось, что это сработает. Тем не менее, сообщение создается SAML версии 1.0 - мне нужно работать с 2.0.

Я знаю, что могу немного поработать и заменить некоторые значения здесь и там, и эта система будет работать нормально. В сообщении очень мало различий, причем самая важная версия. Мне сложно найти информацию о SAML 2.0 для .NET. Я знаю, что SAML 2.0 недавно был внедрен в .NET. Я использую Framework 4.5, поэтому у меня должен быть доступ к нему. На странице MSDN для SamlAssertion говорится, что "majorVersion" является константой, всегда установленной в "1".

Я предполагаю, что есть другое пространство имен, с которым я мог бы работать, но я его не нашел. Мое требование - просто получить сообщение XML SAML. Мне не нужно подписываться с X509, мне не нужен токен. Просто XML-сообщение SAML.

Опять же, это вопрос, пытающийся выяснить, как это сделать в native.NET. Я нашел несколько помощников SAML и много кода о том, как создать сообщение вручную - я пытаюсь найти решение CORRECT, если оно существует.

EDIT: Я нашел, что могу использовать Saml2Assertion. Тем не менее, я не могу найти способ получить сообщение SAML, написанное в xml сейчас.

EDIT2: Я нашел, как написать объект Saml2Assersion в xml. К сожалению, он не поддерживает синтаксис SAML, он записывает в чистый XML без тегов <saml>.

4b9b3361

Ответ 1

В .NET 4.5 встроен WIF (Windows Identity Foundation). Теперь это поддерживает SAML 2.0. Чтобы использовать SAML 2.0, просто используйте .NET 4.5. Имя класса - Saml2XXXX (где XXXX - токен, утверждение, сериализатор и т.д.). Вот ссылка на SAML 2.0. Утверждение: http://msdn.microsoft.com/en-us/library/microsoft.identitymodel.tokens.saml2.saml2assertion.aspx

Это создаст объект утверждения SAML 2.0. Чтобы получить XML, это код, который я использовал:

using System.Xml;
using System.IdentityModel.Tokens;

namespace YOUR.SPACE
{
    public class Saml2Serializer : Saml2SecurityTokenHandler
    {
        public Saml2Serializer()
        {
            Configuration = new SecurityTokenHandlerConfiguration()
                {

                };
        }

        public void WriteSaml2Assertion(XmlWriter writer, Saml2Assertion data)
        {
            base.WriteAssertion(writer, data);
        }
    }
}

Это приведет к сериализации вашего объекта утверждения в XML. Здесь я столкнулся с проблемами. XML будет создавать НЕ содержит пространство имен saml (например, <saml:Assertion>). Я не смог найти решение для этого, поэтому нужно было использовать Replace("<", "<saml:").

Ответ 2

Это потому, что Saml2Assertion ссылается на токен, а не на протокол.

Маркер SAML, используемый в WIF, представляет собой токен 1.0.

В .NET отсутствует поддержка протокола SAML 2.

В SAML 2 есть WIF CTP, но он не обновлялся на века.