コード例 #1
0
        /// <summary>VerifyByXsd</summary>
        /// <param name="saml">string</param>
        /// <param name="schema">SAML2Enum.SamlSchema</param>
        /// <returns>bool</returns>
        /// <remarks>
        /// SAMLのXSDが作成できていないため書きかけ。
        /// - 現時点では、VerifyByXPath メソッドを使って XPath により検証しています。
        /// - XSD検証の方が明らかに良い場合は移行を検討します。
        /// </remarks>
        private static bool VerifyByXsd(string saml, SAML2Enum.SamlSchema schema)
        {
            string embeddedXsdFileName = "";
            string targetNamespace     = "";

            // どうも、OASISのXSDではダメで、
            // - https://docs.oasis-open.org/security/saml/v2.0/saml-schema-protocol-2.0.xsd
            // - https://docs.oasis-open.org/security/saml/v2.0/saml-schema-assertion-2.0.xsd
            // 個別にXSDを作成しないとダメっぽい。

            switch (schema)
            {
            case SAML2Enum.SamlSchema.Request:
                embeddedXsdFileName = "XXXX.xsd";     // RequestのSAML用のXSD
                targetNamespace     = "urn:oasis:names:tc:SAML:2.0:...";
                break;

            case SAML2Enum.SamlSchema.Response:
                embeddedXsdFileName = "XXXX.xsd";     // ResponseのSAML用のXSD
                targetNamespace     = "urn:oasis:names:tc:SAML:2.0:...";
                break;

                //case SAML2Enum.SamlSchema.Assertion:
                //    embeddedXsdFileName = "XXXX.xsd";
                //    targetNamespace = "urn:oasis:names:tc:SAML:2.0:...";
                //    break;
            }

            // 以下の関数は適切に動作するが、XSDに問題があるため動作しない。
            return(XmlLib.ValidateByEmbeddedXsd(
                       "OpenTouryo.Framework", saml, embeddedXsdFileName, targetNamespace));
        }
コード例 #2
0
        /// <summary>VerifyByXPath</summary>
        /// <param name="saml">string</param>
        /// <param name="schema">SAML2Enum.SamlSchema</param>
        /// <param name="samlNsMgr">XmlNamespaceManager</param>
        /// <returns>bool</returns>
        public static bool VerifyByXPath(
            XmlDocument saml, SAML2Enum.SamlSchema schema, XmlNamespaceManager samlNsMgr)
        {
            bool        result      = false;
            XmlNodeList xmlNodeList = null;

            // Nodeの全体構造を検証(属性はチェックしない)。
            // ※ なお、要素・属性取得時も、XPathで構造を指定している。
            switch (schema)
            {
            case SAML2Enum.SamlSchema.Request:

                // Request
                xmlNodeList = saml.SelectNodes(
                    SAML2Const.XPathRequest, samlNsMgr);
                if (xmlNodeList != null && xmlNodeList.Count == 1)
                {
                    // Issuer
                    xmlNodeList = saml.SelectNodes(
                        SAML2Const.XPathIssuerInRequest, samlNsMgr);
                    if (xmlNodeList != null && xmlNodeList.Count == 1)
                    {
                        // NameIDPolicy
                        xmlNodeList = saml.SelectNodes(
                            SAML2Const.XPathNameIDPolicyInRequest, samlNsMgr);
                        if (xmlNodeList != null && xmlNodeList.Count == 1)
                        {
                            result = true;
                        }
                    }
                }

                break;

            case SAML2Enum.SamlSchema.Response:

                bool interimReport = false;
                // Response
                xmlNodeList = saml.SelectNodes(
                    SAML2Const.XPathResponse, samlNsMgr);
                if (xmlNodeList != null && xmlNodeList.Count == 1)
                {
                    // Issuer
                    xmlNodeList = saml.SelectNodes(
                        SAML2Const.XPathIssuerInResponse, samlNsMgr);
                    if (xmlNodeList != null && xmlNodeList.Count == 1)
                    {
                        // Status
                        xmlNodeList = saml.SelectNodes(
                            SAML2Const.XPathStatusCodeInResponse, samlNsMgr);
                        if (xmlNodeList != null && xmlNodeList.Count == 1)
                        {
                            // Assertion
                            xmlNodeList = saml.SelectNodes(
                                SAML2Const.XPathAssertionInResponse, samlNsMgr);
                            if (xmlNodeList != null && xmlNodeList.Count == 1)
                            {
                                interimReport = true;
                            }
                        }
                    }
                }

                // Assertion
                if (interimReport)
                {
                    // Issuer
                    xmlNodeList = saml.SelectNodes(
                        SAML2Const.XPathIssuerInAssertion, samlNsMgr);
                    if (xmlNodeList != null && xmlNodeList.Count == 1)
                    {
                        // NameID
                        xmlNodeList = saml.SelectNodes(
                            SAML2Const.XPathNameIDInAssertion, samlNsMgr);
                        if (xmlNodeList != null && xmlNodeList.Count == 1)
                        {
                            // SubjectConfirmationData
                            xmlNodeList = saml.SelectNodes(
                                SAML2Const.XPathSubjectConfirmationDataInAssertion, samlNsMgr);
                            if (xmlNodeList != null && xmlNodeList.Count == 1)
                            {
                                // Audience
                                xmlNodeList = saml.SelectNodes(
                                    SAML2Const.XPathAudienceInAssertion, samlNsMgr);
                                if (xmlNodeList != null && xmlNodeList.Count == 1)
                                {
                                    // AuthnContextClassRef
                                    xmlNodeList = saml.SelectNodes(
                                        SAML2Const.XPathAuthnContextClassRefInAssertion, samlNsMgr);
                                    if (xmlNodeList != null && xmlNodeList.Count == 1)
                                    {
                                        result = true;
                                    }
                                }
                            }
                        }
                    }
                }
                break;

                //case SAML2Enum.SamlSchema.Assertion:
                //    //...
                //    break;
            }

            return(result);
        }