webentwicklung-frage-antwort-db.com.de

Arbeiten mit SAML 2.0 in C # .NET 4.5

Ich versuche, reines .NET (keine externen Klassen, Steuerelemente, Helfer) zu verwenden, um eine SAML-Nachricht zu erstellen. Ich habe Code in den Interwebs gefunden. das ist was ich habe:

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;

}

und hier ist der Code, den ich verwende, um das XML zu erhalten:

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

Das schien zu funktionieren. Es wird jedoch die Nachricht SAML Version 1.0 ausgegeben - ich muss mit 2.0 arbeiten.

Ich weiß, ich kann ein bisschen schlampig arbeiten und hier und da einige Werte ersetzen, und dieses System würde gut funktionieren. Es gibt nur sehr geringe Unterschiede in der Nachricht, wobei die Version die wichtigste ist. Es fällt mir schwer, Informationen zu SAML 2.0 für .NET zu finden. Ich weiß, dass SAML 2.0 kürzlich in .NET implementiert wurde. Ich verwende Framework 4.5, daher sollte ich Zugriff darauf haben. Die MSDN-Seite für SamlAssertion besagt, dass "majorVersion" eine Konstante ist, die immer auf "1" gesetzt ist.

Ich vermute, es gibt einen anderen Namespace, mit dem ich arbeiten könnte, aber ich habe ihn nicht gefunden. Meine Anforderung ist nur, die XML-SAML-Nachricht zu erhalten. Ich muss nicht mit X509 unterschreiben, ich brauche den Token nicht. Nur die SAML-XML-Nachricht.

Auch dies ist eine Frage, mit der versucht wird, herauszufinden, wie dies in nativem .NET getan werden kann. Ich habe mehrere SAML-Helfer und viel Code zum manuellen Erstellen der Nachricht gefunden. Ich versuche, die RICHTIGE Lösung zu finden, falls sie vorhanden ist.

EDIT: Ich habe festgestellt, dass ich Saml2Assertion verwenden kann. Es ist mir jedoch nicht möglich, die SAML-Nachricht jetzt in XML zu schreiben.

EDIT2: Ich habe herausgefunden, wie man das Saml2Assersion-Objekt in xml schreibt. Leider behält es die SAML-Syntax nicht bei, es schreibt in reinem XML ohne <saml> Stichworte.

33
bugnuker

In .NET 4.5 ist WIF (Windows Identity Foundation) integriert. Dies unterstützt jetzt SAML 2.0. Um SAML 2.0 zu nutzen, verwenden Sie einfach .NET 4.5. Der Klassenname lautet Saml2XXXX (wobei XXXX das Token, die Zusicherung, der Serializer usw. ist). Hier ist ein Link zur SAML 2.0-Zusicherung: http://msdn.Microsoft.com/en-us/library/Microsoft.identitymodel). tokens.saml2.saml2assertion.aspx

Dadurch wird ein SAML 2.0-Assertion-Objekt erstellt. Dies ist der Code, den ich verwendet habe, um das XML zu erhalten:

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

Dadurch wird Ihr Assertionsobjekt in XML serialisiert. Hier bin ich auf Probleme gestoßen. Die XML-Datei, die erstellt wird, enthält NICHT den Saml-Namespace (z. B. <saml:Assertion>). Ich konnte keine Lösung dafür finden, daher musste eine Replace("<", "<saml:") verwendet werden.

34
bugnuker

Das liegt daran, dass sich Saml2Assertion nicht auf das Protokoll, sondern auf das Token bezieht.

Das in WIF verwendete SAML-Token ist ein 1.0-Token.

In .NET wird kein SAML 2-Protokoll unterstützt.

Es gibt eine WIF CTP für SAML 2, die jedoch seit Ewigkeiten nicht mehr aktualisiert wurde.

4
nzpcmad