Praca z SAML 2.0 w C # .NET 4.5

Próbuję użyć czystego .NET (brak klas zewnętrznych, kontrolek, pomocników) do utworzenia komunikatu SAML. Znalazłem kod na stronach internetowych; to jest to, co mam:

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;

}

a oto kod, którego używam do pobrania 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
    );
}

Wyglądało na to, że to zadziała. Jednak wiadomość jest produkowana w wersji 1.0 SAML - muszę pracować z 2.0.

Wiem, że mogę zrobić trochę niechlujnej pracy i zastąpić niektóre wartości tu i tam, a ten system działa dobrze. W komunikacie jest bardzo mało różnic, najważniejsza jest wersja. Trudno mi znaleźć informacje na temat SAML 2.0 dla .NET. Wiem, że SAML 2.0 został niedawno zaimplementowany w .NET. Używam Framework 4.5, więc powinienem mieć do niego dostęp. Strona MSDN dla SamlAssertion mówi, że „majorVersion” jest stałą, zawsze ustawioną na „1”.

Zgaduję, że jest jeszcze inna przestrzeń nazw, z którą mógłbym pracować, ale jej nie znalazłem. Moim wymaganiem jest tylko pobranie wiadomości XML SAML. Nie muszę podpisywać się z X509, nie potrzebuję tokena. Tylko komunikat SAML XML.

Ponownie, jest to pytanie próbujące dowiedzieć się, jak to zrobić w natywnym .NET. Znalazłem kilka pomocników SAML i mnóstwo kodu na temat ręcznego budowania wiadomości - próbuję znaleźć poprawne rozwiązanie, jeśli istnieje.

EDYCJA: Znalazłem, że mogę użyć Saml2Assertion. Nie mogę jednak znaleźć sposobu na zapisanie wiadomości SAML do xml.

EDIT2: Znalazłem, jak napisać obiekt Saml2Assersion do xml. Niestety, nie zachowuje składni SAML, zapisuje w czystym XML bez<saml> tagi.

questionAnswers(2)

yourAnswerToTheQuestion