Pregunta Trabajando con SAML 2.0 en C # .NET 4.5


Estoy tratando de usar .NET puro (sin clases externas, controles, ayudantes) para crear un mensaje SAML. Encontré un código en las interwebs; Esto es lo que tengo:

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;

}

y aquí está el código que estoy usando para obtener el 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
    );
}

Parecía que iba a funcionar. Sin embargo, el mensaje es produce SAML versión 1.0 - Necesito trabajar con 2.0.

Sé que puedo hacer un trabajo descuidado y reemplazar algunos valores aquí y allá, y este sistema funcionaría bien. Hay muy pocas diferencias en el mensaje, siendo la versión la más importante. Me está costando encontrar información sobre SAML 2.0 para .NET. Sé que SAML 2.0 se implementó recientemente en .NET. Estoy usando Framework 4.5 así que debería tener acceso a él. La página de MSDN para SamlAssertion dice que "majorVersion" es una constante, siempre configurada en '1'.

Supongo que hay otro espacio de nombre con el que podría estar trabajando, pero no lo he encontrado. Mi requisito es solo obtener el mensaje XML SAML. No necesito firmar con X509, no necesito el token. Solo el mensaje XML de SAML.

Una vez más, esta es una pregunta tratando de averiguar cómo hacer esto en .NET nativo. He encontrado varios ayudantes de SAML y muchos códigos sobre cómo compilar el mensaje de forma manual. Estoy intentando encontrar la solución CORRECTA, si existe.

EDITAR: He encontrado que puedo usar Saml2Assertion. Sin embargo, no puedo encontrar una forma de grabar el mensaje SAML en xml ahora.

EDIT2: he encontrado cómo escribir el objeto Saml2Assersion en xml. Lamentablemente, no mantiene la sintaxis SAML, escribe en XML puro sin <saml> etiquetas.


32
2018-03-20 17:08


origen


Respuestas:


.NET 4.5 tiene incorporado WIF (Windows Identity Foundation). Esto ahora es compatible con SAML 2.0. Para utilizar SAML 2.0, simplemente use .NET 4.5. El nombre de la clase es Saml2XXXX (donde XXXX es el token, la aserción, el serializador, etc.) Aquí hay un enlace a la aserción de SAML 2.0: http://msdn.microsoft.com/en-us/library/microsoft.identitymodel.tokens.saml2.saml2assertion.aspx

Esto creará un objeto de aserción SAML 2.0. Para obtener el XML, este es el código que utilicé:

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

Esto serializará su objeto de aserción en XML. Aquí es donde tuve problemas. El XML que se creará NO contiene el espacio de nombres saml (p. <saml:Assertion>) No pude encontrar una solución para esto, así que Replace("<", "<saml:") tuvo que ser usado.


33
2018-03-21 18:46



Eso es porque Saml2Assertion se refiere a la ficha, no al protocolo.

El token de SAML utilizado en WIF es un token de 1.0.

No hay compatibilidad con el protocolo SAML 2 en .NET.

Hay un WIF CTP para SAML 2 pero no se ha actualizado por años.


4
2018-03-20 18:15