无法从SAML 2.0响应XML解析UserID

时间:2016-06-14 14:22:41

标签: c# xml saml-2.0 onelogin

我试图使用onelogin.com C#示例中的示例应用程序,但它似乎非常错误。我最后一个问题是尝试解析SAML响应XML中的UserID之类的问题。我似乎无法找到在SAML中构建的.NET的任何示例C#代码,所以我尝试使用原始XML工具来完成它,但我从来没有得到UserID的匹配:

public string GetNameID()
        {
            XmlNamespaceManager manager = new XmlNamespaceManager(xmlDoc.NameTable);
            manager.AddNamespace("ds", SignedXml.XmlDsigNamespaceUrl);
            manager.AddNamespace("saml", "urn:oasis:names:tc:SAML:2.0:assertion");
            manager.AddNamespace("samlp", "urn:oasis:names:tc:SAML:2.0:protocol");

            XmlNode node = xmlDoc.SelectSingleNode("saml:Assertion/saml:Subject/saml:NameID", manager);
            // node is now null!
            return node.InnerText; // throws exception
        }

这是我的(严重削减)XML已删除所有不相关的节点/部分:

<trust:RequestSecurityTokenResponseCollection xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
  <trust:RequestSecurityTokenResponse>
    <trust:RequestedSecurityToken>
      <saml:Assertion xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Version="2.0" ID="pfxefe742da-7d6f-1f2a-85c6-0ab28c701748" IssueInstant="2016-06-14T12:14:56Z" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <saml:Subject>
          <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">example@email.com</saml:NameID>          
        </saml:Subject>
      </saml:Assertion>
    </trust:RequestedSecurityToken>
    </trust:RequestSecurityTokenResponse>
</trust:RequestSecurityTokenResponseCollection>

1 个答案:

答案 0 :(得分:0)

您可以使用LINQ to XML来搜索您想要的标记:

XDocument xmlDoc = XDocument.Load(xmlFilePath);
List<XElement> userIDs = (from element in xmlDoc.Descendants()
                          .Where(x => x.Name.LocalName.Contains("NameID"))
                          select element).ToList();

然后,您可以使用以下内容访问用户ID:

userIDs[index].Value;

或者如果你想遍历列表:

foreach (XElement element in userIDs)
{
    element.Value; //Do something with this
}

不要忘记将using System.Xml.Linq;添加到文件顶部!