/// <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)); }
/// <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); }