从SAML断言中提取SecurityToken
本文关键字:提取 SecurityToken 断言 SAML | 更新日期: 2023-09-27 18:11:29
我有一个SAML断言的XML,看起来像这样:
<saml:Assertion MajorVersion="1" MinorVersion="1" AssertionID="_9b6e6302-d6a8-47f0-9155-1051a05edbfb" Issuer="http://example.com/adfs/services/trust" IssueInstant="2013-04-29T19:35:51.197Z" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion">
...
</saml:Assertion>
我正在尝试使用类似于下面的代码从这个XML中获得一个SecurityToken:
// Loading the XML referenced above.
XDocument doc = XDocument.Load(new StringReader(assertion));
// Creating config to use in TokenHandlers below; required if not using a SecurityTokenHandlerCollection.
SecurityTokenHandlerConfiguration config = new SecurityTokenHandlerConfiguration();
config.AudienceRestriction.AllowedAudienceUris.Add(new Uri("https://localhost/Orchard/"));
config.CertificateValidator = X509CertificateValidator.None;
// Both of these lines throw Exceptions, as explained below.
new Saml11SecurityTokenHandler() { Configuration = config }.ReadToken(doc.CreateReader());
new Saml2SecurityTokenHandler() { Configuration = config }.ReadToken(doc.CreateReader());
如果我尝试使用Saml11SecurityTokenHandler
读取令牌,我会得到以下异常:
ID4075: SAML断言缺少所需的'MajorVersion'属性。
如果我尝试使用Saml2SecurityTokenHandler
读取令牌,我会得到一个不同的异常:
命名空间名为"urn:oasis:names:tc:SAML:2.0: Assertion"的元素"Assertion"找不到。
显然,Saml2SecurityTokenHandler
的一个是有意义的,因为这是一个SAML 1.1断言。但是,为什么SAML 1.1 TokenHandler不能读取这个断言?
EDIT: reader为空;为什么呢?doc
有含量
string notEmpty = doc.FirstNode.ToString();
string empty = doc.CreateReader().ReadOuterXml();
根据这里展示的技术,这是可行的:
SecurityToken token;
using (StringReader sr = new StringReader(assertion))
{
using (XmlReader reader = XmlReader.Create(sr))
{
if (!reader.ReadToFollowing("saml:Assertion"))
{
throw new Exception("Assertion not found!");
}
SecurityTokenHandlerCollection collection = SecurityTokenHandlerCollection.CreateDefaultSecurityTokenHandlerCollection();
token = collection.ReadToken(reader.ReadSubtree());
}
}
请确保您没有更改XML文档中的空白,否则您将获得签名验证错误。