当前位置: 首页 > 知识库问答 >
问题:

在C#中使用SAML2.0。净4.5

孙海
2023-03-14

我试着用纯的。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。

我知道我可以做一些草率的工作,在这里和那里替换一些值,这个系统会工作得很好。在信息上几乎没有什么不同,版本是最重要的。我很难找到有关SAML2.0的信息。网我知道SAML2.0是在中国实现的。最近。我使用的是框架4.5,所以我应该可以访问它。Samlasertion的MSDN页面上说,“majorVersion”是一个常量,总是设置为“1”。

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

同样,这是一个试图找出如何在本机中做到这一点的问题。NET。我找到了几个SAML助手和大量关于如何手动构建消息的代码——我正在尝试找到CORRECT解决方案,如果它存在的话。

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

EDIT2:我发现了如何将Saml2Assersion对象写入xml。遗憾的是,它没有保留SAML语法,它使用纯XML编写,没有


共有2个答案

嵇永望
2023-03-14

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

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

中没有SAML 2协议支持。网

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

连坚白
2023-03-14

. 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

这将创建一个SAML2.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命名空间(例如

 类似资料:
  • 我们正在尝试用iText(v7)和GlobalSign DSS创建一个文档签名解决方案。有人有这方面的经验吗?我找不到很多(如果有的话)关于这方面的例子。如何将应用编程接口请求(“身份”、“certificate_path”、“时间戳”、“身份/.../标志”、...)与iText结合起来? 我找到了一些示例代码,但它是Java的,并且使用了旧版本的iText(带有PdfStamper)。目标是创

  • 问题内容: 我想使用系统蜂鸣器(并且只有在没有蜂鸣器/无法访问蜂鸣器时才使用扬声器)生成具有特定频率和长度(针对不同的声音信号)的蜂鸣声。我知道可以通过使用ioctl来做到这一点,但这需要root访问权限,而这是我所不希望的。 我知道我可以只使用“ beep”命令,但这将是一个依赖关系,如果可能的话,不应使用它(根本没有外部依赖关系,只有基本的linux库和C)。 我目前拥有的是以下代码(但这需要

  • 当我运行命令< code>rake compile时,我很难弄清楚为什么我的rb_define_singleton和rb_define_method调用会中断。 首先,一个问题可能是我不确定最后一个整数参数实际上代表什么,以便决定使用什么值,我无法找到解释这一点的文档,但我觉得我只是猜测在那里,但问题似乎在第3个参数中,所以我担心的是 其次,我的构建失败,在调用时出现以下错误: 使编译../../

  • 问题内容: 我有一个用Java(> 1.5)编写的项目。 是否可以用C#编写项目的一部分? 例如GUI和调用方法并实例化用Java编写的类? 如果是,怎么办? 问题答案: 有一种称为.NET的Java语言转换助手。您可以将Java类转换为c#并开始编码。 还有一个叫做JNBridge的东西(不是免费的)。

  • 问题内容: 我正在尝试在C#中使用Selenium RemoteWebDriver,基本上我要做的就是在javascript完成对DOM的操作 后 以编程方式抓取网页的html (不弹出浏览器窗口。) 首先,我像这样启动selenium-server.jar: C:\ Program Files \ selenium-server > java -jar“ C:\ Program Files \

  • 问题内容: 我正在尝试使用c创建tar文件。由于某种原因我无法使用 我的代码是: 运行此代码后,当我想解压时 我收到一个错误 我的C代码有什么问题? 问题答案: 我认为您需要在关闭tar文件之前调用tar_append_eof http://linux.die.net/man/3/tar_append_eof。 tar_append_eof()函数将EOF标记(两个全为零的块)写入与t关联的tar