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