C# 查询XML[SAML2.0响应]
下面的xml给我带来了困难。我需要用c#从XML中检索以下内容,您能帮忙吗?还有没有更好的方法来读取/解析c#中的SAML2.0响应C# 查询XML[SAML2.0响应],c#,xml,saml-2.0,C#,Xml,Saml 2.0,下面的xml给我带来了困难。我需要用c#从XML中检索以下内容,您能帮忙吗?还有没有更好的方法来读取/解析c#中的SAML2.0响应 来自 名字值 姓氏值 邮件价值 来自**sso.localhost.dev** 来自**应用程序测试** XML sso.localhost.dev LgH7ZZJWwp5fN02IPteWxh9oAQ8= 目前,中国政府在这一领域的研究中使用了一种非暴力的非暴力的ZZZZFffffffffffffffffffffffffffffffffffffffffff
- 来自
- 名字值
- 姓氏值
- 邮件价值
- 来自
**sso.localhost.dev**
- 来自
**应用程序测试**
sso.localhost.dev
LgH7ZZJWwp5fN02IPteWxh9oAQ8=
目前,中国政府在这一领域的研究中使用了一种非暴力的非暴力的ZZZZFffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8没有任何一个研究内容+f2 2+2 2 2 2 2 2 2 2个关于关于非非非非非政府的研究的2+非非非非非非非政府的非政府的非非政府的非政府组织+2 2+非政府的非政府的非政府的非政府的非政府2 2 2 2+2 2 2 2 2 2 2 2 2 2 2 2 2 2。。。他们的非政府的非政府的非政府的非政府的非政府的非政府的非政府的非政府的非政府的非政府的非政府的非政府的非政府的非政府的非政府的非政府的OW+TBUUTCEBIAQ==
sso.localhost.dev
JSMITH009
应用测试
urn:oasis:name:tc:SAML:2.0:ac:classes:未指定
厕所
厕所。smith@email.localhost.dev
史密斯
如果只想解析XML,可以将其加载到
您还可以使用包的类来解析和验证响应。找到了解决方案
public class SAMLProcessor
{
#region Properties
public string DecodedSAML { get; set; }
public string EncodedeSAML { get; set; }
public string Audience { get; set; }
public string SubjectNameID { get; set; }
public string FirstName { get; set; }
public string Mail { get; set; }
public string LastName { get; set; }
public bool AuthenticationStatus { get; set; }
public string Issuer { get; set; }
public string Destination { get; set; }
public string ResponseID { get; set; }
public bool VerifiedResponse { get; set; }
public string SignatureValue { get; set; }
public string SignatureReferenceDigestValue { get; set; }
public DateTime AutheticationTime { get; set; }
public string AuthenticationSession { get; set; }
#endregion
#region Ctror
public SAMLProcessor(string rawSamlData)
{
EncodedeSAML = rawSamlData;
// the sample data sent us may be already encoded,
// which results in double encoding
if (rawSamlData.Contains('%'))
{
rawSamlData = HttpUtility.UrlDecode(rawSamlData);
}
// read the base64 encoded bytes
string samlAssertion = Decode64Bit(rawSamlData);
DecodedSAML = samlAssertion;
SamlParser(DecodedSAML);
}
#endregion
private static string Decode64Bit(string rawSamlData)
{
byte[] samlData = Convert.FromBase64String(rawSamlData);
// read back into a UTF string
string samlAssertion = Encoding.UTF8.GetString(samlData);
return samlAssertion;
}
/// <summary>
///
/// </summary>
/// <param name="samldata"></param>
/// <returns></returns>
public string SamlParser(string samlXMLdata)
{
//samldata = Decode64Bit("PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4=") + samldata;
string samldata = samlXMLdata;
if (!samldata.StartsWith(@"<?xml version="))
{
samldata = Decode64Bit("PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4=") + samldata;
}
string firstName = string.Empty;
XmlDocument xDoc = new XmlDocument();
samldata = samldata.Replace(@"\", "");
xDoc.LoadXml(samldata);
//xDoc.Load(new System.IO.TextReader());//Suppose the xml you have provided is stored in this xml file.
XmlNamespaceManager xMan = new XmlNamespaceManager(xDoc.NameTable);
xMan.AddNamespace("samlp", "urn:oasis:names:tc:SAML:2.0:protocol");
xMan.AddNamespace("saml", "urn:oasis:names:tc:SAML:2.0:assertion");
xMan.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#");
XmlNode xNode = xDoc.SelectSingleNode("/samlp:Response/samlp:Status/samlp:StatusCode/@Value", xMan);
if (xNode != null)
{
this.AuthenticationStatus = false;
string statusCode = xNode.Value;
if (statusCode.EndsWith("status:Success"))
{
this.AuthenticationStatus = true;
}
}
xNode = xDoc.SelectSingleNode("/samlp:Response/@Destination", xMan);
if (xNode != null)
{
this.Destination = xNode.Value;
}
xNode = xDoc.SelectSingleNode("/samlp:Response/@IssueInstant", xMan);
if (xNode != null)
{
this.AutheticationTime = Convert.ToDateTime(xNode.Value);
}
xNode = xDoc.SelectSingleNode("/samlp:Response/@ID", xMan);
if (xNode != null)
{
this.ResponseID = xNode.Value;
}
xNode = xDoc.SelectSingleNode("/samlp:Response/saml:Issuer", xMan);
if (xNode != null)
{
this.Issuer = xNode.InnerText;
}
xNode = xDoc.SelectSingleNode("/samlp:Response/ds:Signature/ds:SignedInfo/ds:Reference/ds:DigestValue", xMan);
if (xNode != null)
{
this.SignatureReferenceDigestValue = xNode.InnerText;
}
xNode = xDoc.SelectSingleNode("/samlp:Response/ds:Signature/ds:SignatureValue", xMan);
if (xNode != null)
{
this.SignatureValue = xNode.InnerText;
}
xNode = xDoc.SelectSingleNode("/samlp:Response/saml:Assertion/@ID", xMan);
if (xNode != null)
{
this.AuthenticationSession = xNode.Value;
}
xNode = xDoc.SelectSingleNode("/samlp:Response/saml:Assertion/saml:Subject/saml:NameID", xMan);
if (xNode != null)
{
this.SubjectNameID = xNode.InnerText;
}
xNode = xDoc.SelectSingleNode("/samlp:Response/saml:Assertion/saml:Conditions/saml:AudienceRestriction/saml:Audience", xMan);
if (xNode != null)
{
this.Audience = xNode.InnerText;
}
//reverse order
//</saml:AttributeValue></saml:Attribute></saml:AttributeStatement></saml:Assertion></samlp:Response>
//string xQryStr = "//NewPatient[Name='" + name + "']";
//XmlNode matchedNode = xDoc.SelectSingleNode(xQryStr);
// samlp:Response saml:Assertion saml:AttributeStatement saml:Attribute
xNode = xDoc.SelectSingleNode("/samlp:Response/saml:Assertion/saml:AttributeStatement/saml:Attribute[@Name = 'FIRSTNAME']/saml:AttributeValue", xMan);
if (xNode != null)
{
this.FirstName = xNode.InnerText;
}
// samlp:Response saml:Assertion saml:AttributeStatement saml:Attribute
xNode = xDoc.SelectSingleNode("/samlp:Response/saml:Assertion/saml:AttributeStatement/saml:Attribute[@Name = 'MAIL']/saml:AttributeValue", xMan);
if (xNode != null)
{
this.Mail = xNode.InnerText;
}
// samlp:Response saml:Assertion saml:AttributeStatement saml:Attribute
xNode = xDoc.SelectSingleNode("/samlp:Response/saml:Assertion/saml:AttributeStatement/saml:Attribute[@Name = 'LASTNAME']/saml:AttributeValue", xMan);
if (xNode != null)
{
this.LastName = xNode.InnerText;
}
return this.FirstName;
}
}
公共类采样处理器
{
#区域属性
公共字符串DecodedSAML{get;set;}
公共字符串ENCODESAML{get;set;}
公共字符串访问群体{get;set;}
公共字符串SubjectNameID{get;set;}
公共字符串名{get;set;}
公共字符串邮件{get;set;}
公共字符串LastName{get;set;}
公共bool身份验证状态{get;set;}
公共字符串颁发者{get;set;}
公共字符串目标{get;set;}
公共字符串ResponseID{get;set;}
公共布尔验证响应{get;set;}
公共字符串SignatureValue{get;set;}
公共字符串SignatureReferenceDigestValue{get;set;}
公共日期时间验证时间{get;set;}
公共字符串身份验证会话{get;set;}
#端区
#区域中心
公共采样处理器(字符串rawSamlData)
{
encodesAML=rawSamlData;
//发送给我们的样本数据可能已经编码,
//这会导致双重编码
if(rawSamlData.Contains('%'))
{
rawSamlData=HttpUtility.UrlDecode(rawSamlData);
}
//读取base64编码的字节
字符串samlAssertion=解码64位(rawSamlData);
DecodedSAML=samlasertion;
SamlParser(DecodedSAML);
}
#端区
专用静态字符串解码64位(字符串rawSamlData)
{
字节[]samlData=Convert.FromBase64String(rawSamlData);
//读回UTF字符串
string samlAssertion=Encoding.UTF8.GetString(samlData);
返回samlasertion;
}
///
///
///
///
///
公共字符串SamlParser(字符串samlXMLdata)
{
//samldata=decode64位(“pd94bwgdmvyc2lvbj0ims4wiiblbmnvzgluz0ivvrgltgipz4=”)+samldata;
字符串samldata=samlXMLdata;
如果(!samldata.StartsWith(@)”
public class SAMLProcessor
{
#region Properties
public string DecodedSAML { get; set; }
public string EncodedeSAML { get; set; }
public string Audience { get; set; }
public string SubjectNameID { get; set; }
public string FirstName { get; set; }
public string Mail { get; set; }
public string LastName { get; set; }
public bool AuthenticationStatus { get; set; }
public string Issuer { get; set; }
public string Destination { get; set; }
public string ResponseID { get; set; }
public bool VerifiedResponse { get; set; }
public string SignatureValue { get; set; }
public string SignatureReferenceDigestValue { get; set; }
public DateTime AutheticationTime { get; set; }
public string AuthenticationSession { get; set; }
#endregion
#region Ctror
public SAMLProcessor(string rawSamlData)
{
EncodedeSAML = rawSamlData;
// the sample data sent us may be already encoded,
// which results in double encoding
if (rawSamlData.Contains('%'))
{
rawSamlData = HttpUtility.UrlDecode(rawSamlData);
}
// read the base64 encoded bytes
string samlAssertion = Decode64Bit(rawSamlData);
DecodedSAML = samlAssertion;
SamlParser(DecodedSAML);
}
#endregion
private static string Decode64Bit(string rawSamlData)
{
byte[] samlData = Convert.FromBase64String(rawSamlData);
// read back into a UTF string
string samlAssertion = Encoding.UTF8.GetString(samlData);
return samlAssertion;
}
/// <summary>
///
/// </summary>
/// <param name="samldata"></param>
/// <returns></returns>
public string SamlParser(string samlXMLdata)
{
//samldata = Decode64Bit("PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4=") + samldata;
string samldata = samlXMLdata;
if (!samldata.StartsWith(@"<?xml version="))
{
samldata = Decode64Bit("PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4=") + samldata;
}
string firstName = string.Empty;
XmlDocument xDoc = new XmlDocument();
samldata = samldata.Replace(@"\", "");
xDoc.LoadXml(samldata);
//xDoc.Load(new System.IO.TextReader());//Suppose the xml you have provided is stored in this xml file.
XmlNamespaceManager xMan = new XmlNamespaceManager(xDoc.NameTable);
xMan.AddNamespace("samlp", "urn:oasis:names:tc:SAML:2.0:protocol");
xMan.AddNamespace("saml", "urn:oasis:names:tc:SAML:2.0:assertion");
xMan.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#");
XmlNode xNode = xDoc.SelectSingleNode("/samlp:Response/samlp:Status/samlp:StatusCode/@Value", xMan);
if (xNode != null)
{
this.AuthenticationStatus = false;
string statusCode = xNode.Value;
if (statusCode.EndsWith("status:Success"))
{
this.AuthenticationStatus = true;
}
}
xNode = xDoc.SelectSingleNode("/samlp:Response/@Destination", xMan);
if (xNode != null)
{
this.Destination = xNode.Value;
}
xNode = xDoc.SelectSingleNode("/samlp:Response/@IssueInstant", xMan);
if (xNode != null)
{
this.AutheticationTime = Convert.ToDateTime(xNode.Value);
}
xNode = xDoc.SelectSingleNode("/samlp:Response/@ID", xMan);
if (xNode != null)
{
this.ResponseID = xNode.Value;
}
xNode = xDoc.SelectSingleNode("/samlp:Response/saml:Issuer", xMan);
if (xNode != null)
{
this.Issuer = xNode.InnerText;
}
xNode = xDoc.SelectSingleNode("/samlp:Response/ds:Signature/ds:SignedInfo/ds:Reference/ds:DigestValue", xMan);
if (xNode != null)
{
this.SignatureReferenceDigestValue = xNode.InnerText;
}
xNode = xDoc.SelectSingleNode("/samlp:Response/ds:Signature/ds:SignatureValue", xMan);
if (xNode != null)
{
this.SignatureValue = xNode.InnerText;
}
xNode = xDoc.SelectSingleNode("/samlp:Response/saml:Assertion/@ID", xMan);
if (xNode != null)
{
this.AuthenticationSession = xNode.Value;
}
xNode = xDoc.SelectSingleNode("/samlp:Response/saml:Assertion/saml:Subject/saml:NameID", xMan);
if (xNode != null)
{
this.SubjectNameID = xNode.InnerText;
}
xNode = xDoc.SelectSingleNode("/samlp:Response/saml:Assertion/saml:Conditions/saml:AudienceRestriction/saml:Audience", xMan);
if (xNode != null)
{
this.Audience = xNode.InnerText;
}
//reverse order
//</saml:AttributeValue></saml:Attribute></saml:AttributeStatement></saml:Assertion></samlp:Response>
//string xQryStr = "//NewPatient[Name='" + name + "']";
//XmlNode matchedNode = xDoc.SelectSingleNode(xQryStr);
// samlp:Response saml:Assertion saml:AttributeStatement saml:Attribute
xNode = xDoc.SelectSingleNode("/samlp:Response/saml:Assertion/saml:AttributeStatement/saml:Attribute[@Name = 'FIRSTNAME']/saml:AttributeValue", xMan);
if (xNode != null)
{
this.FirstName = xNode.InnerText;
}
// samlp:Response saml:Assertion saml:AttributeStatement saml:Attribute
xNode = xDoc.SelectSingleNode("/samlp:Response/saml:Assertion/saml:AttributeStatement/saml:Attribute[@Name = 'MAIL']/saml:AttributeValue", xMan);
if (xNode != null)
{
this.Mail = xNode.InnerText;
}
// samlp:Response saml:Assertion saml:AttributeStatement saml:Attribute
xNode = xDoc.SelectSingleNode("/samlp:Response/saml:Assertion/saml:AttributeStatement/saml:Attribute[@Name = 'LASTNAME']/saml:AttributeValue", xMan);
if (xNode != null)
{
this.LastName = xNode.InnerText;
}
return this.FirstName;
}
}