在C#.NET 4.5,SAML 2.0工作(Working with SAML 2.0 in C#

2019-07-22 04:00发布

我试图用纯.NET(无外部类,控制助手)来创建一个SAML消息。 我发现在interwebs一些代码; 这是我有:

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最近。 我使用的框架4.5,所以我应该有机会获得它。 对于SamlAssertion的MSDN页说,“majorVersion”是一个常数,始终设置为“1”。

我猜还有另外一个名字空间,我可以与一起工作,但我还没有找到它。 我的要求是刚刚拿到XML SAML消息。 我不需要用X509签,我不需要令牌。 就在SAML XML消息。

再次,这是试图找出如何在本地.NET这样做的问题。 我已经发现了几个帮手SAML和大量的代码如何构建manually-我试图找到正确的解决方案,如果它存在的消息。

编辑:我发现我可以使用Saml2Assertion。 但是,我无法找到一个办法让现在写XML的SAML消息。

EDIT2:我已经找到了如何编写Saml2Assersion对象到XML。 可悲的是,它不留SAML的语法,它写入纯XML没有<saml>标签。

Answer 1:

.NET 4.5具有WIF(Windows标识基金会)内置到它。 这现在支持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:")不得不使用。



Answer 2:

这是因为Saml2Assertion指令牌不是协议。

在WIF使用的SAML令牌是1.0令牌。

有在.NET没有SAML 2协议支持。

有一个WIF CTP的SAML 2,但它尚未升级的年龄。



文章来源: Working with SAML 2.0 in C# .NET 4.5