在 C# .NET 4.5 中使用 SAML 2.0
Posted
技术标签:
【中文标题】在 C# .NET 4.5 中使用 SAML 2.0【英文标题】:Working with SAML 2.0 in C# .NET 4.5 【发布时间】:2013-03-09 22:32:26 【问题描述】:我正在尝试使用纯 .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>
标记。
【问题讨论】:
就个人而言,我会选择使用库,因为它可以节省时间。你可以使用像 componentpro.com/saml.net 这样的库来帮助你,samlcomponent.net 有代码示例。 需要添加对System.IdentityModel.dll的引用并添加System.IdentityModel.Tokens命名空间。 【参考方案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:")
。
【讨论】:
在这里投票:connect.microsoft.com/VisualStudio/feedback/details/781848/… 不要继承Saml2SecurityTokenHandler
只是为了创建一个WriteAssertion
方法,你可以像这样使用WriteToken
:handler.WriteToken(writer, new Saml2SecurityToken(assertion));
我可以使用 .NET 4.0 并使用 .NET 4.5 进行身份验证吗?我有一堆 .NET 4.0 库,因此升级所有库需要大量工作。
我们公司主要是一家 java 商店,但我是少数 .net 人之一。出于好奇,有人知道 java“标准库/框架”是否有任何内置类来使用 SAML 2.0?
更新了 Saml2Assertion 文档链接:docs.microsoft.com/en-us/dotnet/api/…【参考方案2】:
这是因为 Saml2Assertion 指的是令牌而不是协议。
WIF 中使用的 SAML 令牌是 1.0 令牌。
.NET 中不支持 SAML 2 协议。
有一个用于 SAML 2 的 WIF CTP,但它已经很久没有升级了。
【讨论】:
不正确。 SAML2(实际上是 WIF)已完全实施到 4.5 框架中。这是一个链接:msdn.microsoft.com/en-us/library/… 另外,SAML2Assertion 是断言,并且令牌有一个 Saml2Token 类。到目前为止,除了缺少 saml 的 XML 命名空间外,一切都运行良好。一旦我弄清楚(可能是 XMLWriter 问题)我会发布解决方案。 查看命名空间——它是令牌而不是协议——协议列表在这里——msdn.microsoft.com/en-us/library/ee709285.aspx 感谢命名空间链接。非常感谢您的回答,其他人没有。我不是在寻找协议。我的问题很清楚。我引用“我不需要令牌。只需 SAML XML 消息。”我只需要xml消息。其余的我来处理。再次感谢! 明白。所以要么自己编写 XML - 没有帮助类 - 要么看这里thinktecture.github.com/Thinktecture.IdentityModel.45。这支持各种令牌并且是开源的。如果它不支持 Token 2.0 的东西,它可能会给你一些线索。 是的 - Microsoft 已经从 Internet 上删除了堆栈。以上是关于在 C# .NET 4.5 中使用 SAML 2.0的主要内容,如果未能解决你的问题,请参考以下文章
服务提供者之间的 SAML 2.0 身份验证断言(C#、.net、MVC4、组件空间)
.NET 4.5 和 C# 中带有 HttpClient 的 HTTP HEAD 请求
如何在 C# (.NET 4.5) 中为 HttpClient.GetAsync(URI) 创建回调?
如何使用 Oracle 和 SQL Server 将 .NET 4.5 C# Entity Framework 6 中的列映射为大写?