在C# .NET 4.5中使用SAML 2.0进行工作

6 浏览
0 Comments

在C# .NET 4.5中使用SAML 2.0进行工作

我正在尝试使用纯.NET(没有外部类、控件、助手)来创建一个SAML消息。我在互联网上找到了一些代码;以下是我目前的代码:

private static SamlAssertion createSamlAssertion()
{
    // 在这里创建具有ID和发行者名称的一些SAML断言。
    SamlAssertion assertion = new SamlAssertion();
    assertion.AssertionId = "AssertionID";
    assertion.Issuer = "ISSUER";
    // 创建一些SAML主题。
    SamlSubject samlSubject = new SamlSubject();
    samlSubject.Name = "My Subject";
    // 
    // 创建一个具有几个值的SAML属性。
    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";
    // 
    // 现在创建包含一个属性和一个主题的SAML语句。
    SamlAttributeStatement samlAttributeStatement = new SamlAttributeStatement();
    samlAttributeStatement.Attributes.Add(attr);
    samlAttributeStatement.SamlSubject = samlSubject;
    // 将语句附加到SAML断言。
    assertion.Statements.Add(samlAttributeStatement);
    //返回断言
    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的方法。

编辑2:我已经找到了如何将Saml2Assersion对象写入xml。不幸的是,它不保留SAML语法,它以纯XML写入,没有标签。

0