Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#.NET4.5中使用SAML2.0_C#_.net_Saml_Saml 2.0 - Fatal编程技术网

在C#.NET4.5中使用SAML2.0

在C#.NET4.5中使用SAML2.0,c#,.net,saml,saml-2.0,C#,.net,Saml,Saml 2.0,我正在尝试使用纯.NET(没有外部类、控件和助手)创建SAML消息。我在互联网上找到了一些代码;这就是我所拥有的: private static SamlAssertion createSamlAssertion() { // Here we create some SAML assertion with ID and Issuer name. SamlAssertion assertion = new SamlAssertion(); assertion.Assert

我正在尝试使用纯.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的SAML2.0的信息。我知道SAML2.0最近被实现到了.NET中。我使用的是Framework4.5,所以我应该可以访问它。Samlasertion的MSDN页面上说“majorVersion”是一个常量,总是设置为“1”

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

同样,这是一个试图找出如何在本机.NET中实现这一点的问题。我已经找到了几个SAML帮助程序和许多关于如何手动构建消息的代码——我正在尝试找到正确的解决方案,如果它存在的话

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


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

这是因为Saml2Assertion引用的是令牌而不是协议

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

NET中不支持SAML2协议

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

.NET4.5内置了WIF(Windows身份基础)。现在它支持SAML2.0。 要使用SAML2.0,只需使用.NET4.5即可。类名是Saml2XXXX(其中XXXX是令牌、断言、序列化程序等),这里是指向saml2.0断言的链接:

这将创建一个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命名空间(例如
)。我找不到解决方案,所以在4.5框架中完全实现了
Replace(“不正确的。SAML2(实际上是WIF)。这里有一个链接:另外,SAML2Assertion是assersion,并且有一个用于标记的Saml2Token类。到目前为止,除了缺少saml的XML命名空间之外,一切都很好。一旦我弄清楚了这一点(可能是XMLWriter问题)我会发布解决方案。看看名称空间-这是令牌而不是协议-协议列表在这里-感谢名称空间链接。我非常感谢您的回答,没有其他人回答过。我不是在寻找协议。我的问题很清楚。我引用“我不需要令牌,只需要SAML XML消息。”。"我只需要xml消息。其余的我正在处理。再次感谢!明白了。因此,您可以自己编写xml-无帮助程序类-或查看此处。这支持多种令牌,并且是开源的。如果它不支持令牌2.0的内容,它可能会给您一些线索。是的-Microsoft已从Internet上删除了堆栈。请在此处投票:In除了继承
Saml2SecurityTokenHandler
来生成
WriteAssertion
方法之外,您可以像这样使用
WriteToken
handler.WriteToken(writer,新的Saml2SecurityToken(断言));
我可以使用.NET 4.0并使用.NET 4.5进行身份验证吗?我有一大堆.NET 4.0库,所以升级所有库需要做很多工作。我们公司主要是一家java商店,但我是为数不多的.NET人员之一。出于好奇,有人知道java是否是“标准库/框架”吗是否有任何内置类可以使用SAML 2.0?更新的Saml2Assertion文档链接:就个人而言,我会选择使用bc库,这样可以节省时间。您可以使用这样的库来帮助您,并提供代码示例。需要添加对System.IdentityModel.dll的引用,并添加System.IdentityModel.Tokens命名空间。