36

我正在尝试使用纯 .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。

我知道我可以做一些草率的工作并在这里和那里替换一些值,这个系统可以正常工作。消息中的差异很小,版本是最重要的。我很难找到有关 .NET 的 SAML 2.0 的信息。我知道 SAML 2.0 最近已在 .NET 中实现。我正在使用 Framework 4.5,所以我应该可以访问它。SamlAssertion 的 MSDN 页面说“majorVersion”是一个常量,始终设置为“1”。

我猜我可以使用另一个命名空间,但我还没有找到它。我的要求只是获取 XML SAML 消息。我不需要用 X509 签名,我不需要令牌。只是 SAML XML 消息。

同样,这是一个试图找出如何在本机 .NET 中执行此操作的问题。我找到了几个 SAML 助手和大量关于如何手动构建消息的代码——我正在尝试找到正确的解决方案(如果存在)。

编辑:我发现我可以使用 Saml2Assertion。但是,我现在无法找到将 SAML 消息写入 xml 的方法。

EDIT2:我找到了如何将 Saml2Assersion 对象写入 xml。遗憾的是,它没有保留 SAML 语法,它以纯 XML 编写,没有<saml>标签。

4

2 回答 2

36

.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:")必须使用 a 。

于 2013-03-21T18:46:02.177 回答
4

那是因为 Saml2Assertion 指的是令牌而不是协议。

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

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

SAML 2有一个 WIF CTP,但它已经很久没有升级了。

于 2013-03-20T18:15:35.727 回答