Exemplo n.º 1
0
        public static void UrlDecodeTest(string str)
        {
            try
            {
                // Performs encryption using the components touryo.
                string strValue = CustomEncode.UrlEncode(str);

                // Performs decrypted using the components touryo.
                string str1 = CustomEncode.UrlDecode(strValue);

                // Check whether it is decrypted into the original string.
                Assert.AreEqual(str, str1);
            }
            catch (Exception ex)
            {
                // Print a stack trace when an exception occurs.
                Console.WriteLine(ex.StackTrace);
                throw;
            }
        }
Exemplo n.º 2
0
        /// <summary>EncodeAndSignRedirect</summary>
        /// <param name="type">SAML2Enum.RequestOrResponse</param>
        /// <param name="saml">string</param>
        /// <param name="relayState">string</param>
        /// <param name="dsRSAwithSHA1">DigitalSign</param>
        /// <returns>RedirectBinding用クエリ文字列</returns>
        public static string EncodeAndSignRedirect(
            SAML2Enum.RequestOrResponse type,
            string saml, string relayState,
            DigitalSign dsRSAwithSHA1 = null)
        {
            // --------------------------------------------------
            // - XML → XML宣言のエンコーディング → DEFLATE圧縮
            // -   → Base64エンコード → URLエンコード →  クエリ文字列テンプレへ組込
            // -      → コレをASCIIエンコード → 署名 → Base64エンコード
            // -         → URLエンコード →  Signatureパラメタ追加。
            // --------------------------------------------------
            // ・ヘッダも必要
            //   "<?xml version="1.0" encoding="UTF-8"?>"
            // ・クエリ文字列テンプレート
            //   ・SAMLRequest=value&RelayState=value&SigAlg=value
            //   ・SAMLResponse=value&RelayState=value&SigAlg=value
            // ・クエリ文字列署名
            //   ・クエリ文字列パラメタ値が空文字列の場合は、パラメタ自体を署名の演算から除外する。
            //   ・署名対象は上記テンプレートの文字列で、署名は、SignatureパラメタとしてURLに追加。

            string queryString         = "";
            string queryStringTemplate = "";

            #region クエリ文字列テンプレート生成
            if (string.IsNullOrEmpty(saml))
            {
                return("");
            }
            else
            {
                // 第1 QSパラメタ
                switch (type)
                {
                case SAML2Enum.RequestOrResponse.Request:
                    queryStringTemplate += "SAMLRequest={SAML}";
                    break;

                case SAML2Enum.RequestOrResponse.Response:
                    queryStringTemplate += "SAMLResponse={SAML}";
                    break;
                }

                // 第2 QSパラメタ
                if (string.IsNullOrEmpty(relayState))
                {
                    // RelayStateパラメタなし
                }
                else
                {
                    queryStringTemplate += "&RelayState={RelayState}";
                }

                // 第3 QSパラメタ
                if (dsRSAwithSHA1 == null)
                {
                    // SigAlg, Signatureパラメタなし
                }
                else
                {
                    // 第3 QSパラメタ
                    queryStringTemplate += "&SigAlg=" + CustomEncode.UrlEncode(SAML2Const.RSAwithSHA1);
                }
            }
            #endregion

            #region エンコーディング

            //// エンコーディング オブジェクトの取得
            //Encoding enc = XmlLib.GetEncodingFromXmlDeclaration(saml);

            // XML (→ XML宣言のエンコーディングではなく、asciiエンコーディングに変更)
            // → DEFLATE圧縮 → Base64エンコード → URLエンコード
            saml = CustomEncode.UrlEncode(CustomEncode.ToBase64String(
                                              DeflateCompression.Compress(CustomEncode.StringToByte(saml, CustomEncode.us_ascii))));
            #endregion

            #region 組込 & 署名

            // 署名対象となるクエリ文字列の生成(クエリ文字列のテンプレートへ組込
            queryString = queryStringTemplate;

            // - SAMLReXXXXXパラメタ
            queryString = queryString.Replace("{SAML}", saml);

            // - RelayStateパラメタ
            if (!string.IsNullOrEmpty(relayState))
            {
                queryString = queryString.Replace("{RelayState}", CustomEncode.UrlEncode(relayState));
            }

            // - Signatureパラメタ
            if (dsRSAwithSHA1 != null)
            {
                // ASCIIエンコード → 署名 → Base64エンコード → URLエンコード →  Signatureパラメタ追加。
                string signature = CustomEncode.UrlEncode(CustomEncode.ToBase64String(
                                                              dsRSAwithSHA1.Sign(CustomEncode.StringToByte(
                                                                                     queryString, CustomEncode.us_ascii)))); // enc.CodePage))));

                queryString = queryString + "&Signature=" + signature;
            }
            #endregion

            return(queryString);
        }
        /// <summary>OnAuthorizeRequest</summary>
        /// <param name="sender">object</param>
        /// <param name="e">EventArgs</param>
        private void OnAuthorizeRequest(object sender, EventArgs e)
        {
            // OnBeginRequestのロジックはここに挿入
            HttpApplication application = (HttpApplication)sender;
            HttpContext     context     = application.Context;

            if (context.Request.IsAuthenticated)
            {
                string path          = context.Request.Url.AbsolutePath;
                string orgQuery      = context.Request.Url.Query;
                string reWritedQuery = orgQuery;

                string virtualPath = path.Substring(path.IndexOf(context.Request.ApplicationPath));
                this.OriginalVirtualPath = virtualPath + orgQuery;

                if (path.IndexOf(ASPNETIdentityConfig.OAuth2AuthorizeEndpoint2) == -1 &&
                    path.IndexOf(ASPNETIdentityConfig.OAuth2AuthorizeEndpoint) != -1)
                {
                    string pattern = "";

                    if (!string.IsNullOrEmpty(orgQuery))
                    {
                        // parameter書き換えでBad Requestを回避

                        #region response_type

                        // OpenID Connect : Implicit Flow
                        //                  - [response_type=id_token]
                        //                  - or [response_type=id_token token]
                        //                : Hybrid Flow
                        //                  - [response_type=code id_token]
                        //                  - or [response_type=code token]
                        //                  - or [response_type=code id_token token]

                        pattern = "response_type=";
                        string responseType = orgQuery.Substring(orgQuery.IndexOf(pattern) + pattern.Length);

                        if (!string.IsNullOrEmpty(responseType))
                        {
                            #region フラグ初期化

                            // OIDC Implicit
                            bool is_id_token       = false;
                            bool is_id_token_token = false;

                            // [response_type=id_token token]
                            is_id_token_token = responseType.StartsWith(
                                CustomEncode.UrlEncode(OAuth2AndOIDCConst.OidcImplicit2_ResponseType));
                            if (!is_id_token_token)
                            {
                                // [response_type=token]
                                is_id_token = responseType.StartsWith(OAuth2AndOIDCConst.OidcImplicit1_ResponseType);
                            }

                            // OIDC Hybrid
                            bool is_code_id_token       = false;
                            bool is_code_token          = false;
                            bool is_code_id_token_token = false;

                            // [response_type=code id_token token]
                            is_code_id_token_token = responseType.StartsWith(
                                CustomEncode.UrlEncode(OAuth2AndOIDCConst.OidcHybrid3_ResponseType));

                            if (!is_code_id_token_token)
                            {
                                // [response_type=code id_token]
                                is_code_id_token = responseType.StartsWith(
                                    CustomEncode.UrlEncode(OAuth2AndOIDCConst.OidcHybrid2_IdToken_ResponseType));
                                // [response_type=code token]
                                is_code_token = responseType.StartsWith(
                                    CustomEncode.UrlEncode(OAuth2AndOIDCConst.OidcHybrid2_Token_ResponseType));
                            }

                            #endregion

                            #region パラメタ書き換え(補助輪回避)
                            // [response_type=id_token] or [response_type=id_token token]
                            if (is_id_token || is_id_token_token)
                            {
                                // OIDC Implicit
                                if (is_id_token)
                                {
                                    this.RewritedResponseTypeFrom_IdToken = true;
                                    reWritedQuery = reWritedQuery.Replace(
                                        "response_type=" + OAuth2AndOIDCConst.OidcImplicit1_ResponseType,
                                        "response_type=" + OAuth2AndOIDCConst.ImplicitResponseType);
                                }
                                else if (is_id_token_token)
                                {
                                    this.RewritedResponseTypeFrom_IdTokenToken = true;
                                    reWritedQuery = reWritedQuery.Replace(
                                        "response_type=" + CustomEncode.UrlEncode(OAuth2AndOIDCConst.OidcImplicit2_ResponseType),
                                        "response_type=" + OAuth2AndOIDCConst.ImplicitResponseType);
                                }
                            }
                            else if (is_code_id_token || is_code_token || is_code_id_token_token)
                            {
                                // OIDC Hybrid
                                if (is_code_id_token)
                                {
                                    this.RewritedResponseTypeFrom_CodeIdToken = true;
                                    reWritedQuery = reWritedQuery.Replace(
                                        "response_type=" + CustomEncode.UrlEncode(OAuth2AndOIDCConst.OidcHybrid2_IdToken_ResponseType),
                                        "response_type=" + OAuth2AndOIDCConst.AuthorizationCodeResponseType);
                                }
                                else if (is_code_token)
                                {
                                    this.RewritedResponseTypeFrom_CodeToken = true;
                                    reWritedQuery = reWritedQuery.Replace(
                                        "response_type=" + CustomEncode.UrlEncode(OAuth2AndOIDCConst.OidcHybrid2_Token_ResponseType),
                                        "response_type=" + OAuth2AndOIDCConst.AuthorizationCodeResponseType);
                                }
                                else if (is_code_id_token_token)
                                {
                                    this.RewritedResponseTypeFrom_CodeIdTokenToken = true;
                                    reWritedQuery = reWritedQuery.Replace(
                                        "response_type=" + CustomEncode.UrlEncode(OAuth2AndOIDCConst.OidcHybrid3_ResponseType),
                                        "response_type=" + OAuth2AndOIDCConst.AuthorizationCodeResponseType);
                                }
                            }
                            else
                            {
                                // サポートなし
                            }

                            #endregion
                        }

                        #endregion

                        #region response_mode

                        // OAuth2.0, OpenID Connect : response_mode=form_postに対応

                        pattern = "response_mode=";
                        string responseMode = orgQuery.Substring(orgQuery.IndexOf(pattern) + pattern.Length);

                        if (!string.IsNullOrEmpty(responseMode))
                        {
                            //bool is_query = false;
                            //bool is_fragment = false;
                            bool is_form_post = false;

                            //is_query = responseMode.StartsWith(OAuth2AndOIDCConst.query);
                            //is_fragment = responseMode.StartsWith(OAuth2AndOIDCConst.fragment);
                            is_form_post = responseMode.StartsWith(OAuth2AndOIDCConst.form_post);

                            if (is_form_post)
                            {
                                this.RewritedResponseModeFrom_FromPost = true;
                                //reWritedQuery = reWritedQuery.Replace("response_mode=form_post","");
                            }
                        }

                        #endregion

                        if (this.RewritedResponseTypeFrom_IdToken ||
                            this.RewritedResponseTypeFrom_IdTokenToken ||
                            this.RewritedResponseTypeFrom_CodeIdToken ||
                            this.RewritedResponseTypeFrom_CodeToken ||
                            this.RewritedResponseTypeFrom_CodeIdTokenToken)
                        //|| this.RewritedResponseModeFrom_FromPost)
                        {
                            context.RewritePath(virtualPath + reWritedQuery, false);
                        }
                    }
                }
            }
        }