1

次のように、アプリケーションに対する Okta の応答を読んでいます。属性を読み取るための nuget パッケージまたはオープンソース クラスがあることをお知らせください。

        var xml = HttpContext.Request.Form["SAMLResponse"];
        byte[] byteData = Convert.FromBase64String(xml);
        string samlXmlString = Encoding.UTF8.GetString(byteData);
        var stream = new StringReader(samlXmlString);
        var xmlReader = XmlReader.Create(stream);
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(samlXmlString);
        var emailElement = doc.GetElementsByTagName("saml2:NameID");
        var attributes = doc.GetElementsByTagName("saml2:Attribute"); 
        var attributesValues = doc.GetElementsByTagName("saml2:AttributeValue");
        var username = emailElement[0].InnerText;
        var role = attributesValues[0].InnerText;
4

2 に答える 2

1

SAML 応答属性は、次のコードから読み取ることができます。

var responseDecoded = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(HttpUtility.HtmlDecode(HttpContext.Current.Request.Form["SAMLResponse"])));

        // Pick out the token
        using (StringReader sr = new StringReader(responseDecoded))
        {
            using (XmlReader reader = XmlReader.Create(sr))
            {
                reader.ReadToFollowing("Assertion", "urn:oasis:names:tc:SAML:2.0:assertion");

                // Deserialize the token so that data can be taken from it and plugged into the RSTR
                SecurityTokenHandlerCollection coll = SecurityTokenHandlerCollection.CreateDefaultSecurityTokenHandlerCollection();
                token = (Saml2SecurityToken)coll.ReadToken(reader.ReadSubtree());
            }
        }

        if (token != null)
        {
            UserName = token.Assertion.Subject.NameId.Value;
            Issuer = token.Assertion.Issuer.Value;

            var saml2Statement = token.Assertion.Statements.FirstOrDefault(x => x.GetType() == new Saml2AttributeStatement().GetType());
            if (saml2Statement != null)
            {
                var attributes = ((Saml2AttributeStatement)saml2Statement).Attributes;
                if (attributes != null)
                {
                    if (attributes.FirstOrDefault(x => x.Name.ToString().ToLower().Equals("firstname")) != null)
                        FirstName = attributes.FirstOrDefault(x => x.Name.ToString().ToLower().Equals("firstname")).Values.FirstOrDefault();

                    if (attributes.FirstOrDefault(x => x.Name.ToString().ToLower().Equals("lastname")) != null)
                        LastName = attributes.FirstOrDefault(x => x.Name.ToString().ToLower().Equals("lastname")).Values.FirstOrDefault();
                }
            }
        }
于 2015-02-17T22:37:30.767 に答える