/// <summary> /// 暗号化<br/> /// Rijndael アルゴリズムを使用<br/> /// </summary> /// <param name="st">認証キー</param> /// <returns>暗号化された認証キー</returns> internal static string EncryptString(string st) { // チケットのチェック(null、空白チェック) if (st == null || st == "") { throw new ArgumentNullException("Key"); } // メソッド開始を記録します。 PCSiteTraceSource.MethodStart(st); try { // 暗号化された認証キー string encryptionTicket; byte[] key = null; byte[] iv = null; // 暗号化キーを作成します。 GenerateKey(ref key, ref iv); // 入力文字列を byte 配列に変換します。 ASCIIEncoding encoding = new ASCIIEncoding(); byte[] source = encoding.GetBytes(st); // Rijndael のサービス プロバイダを生成します。 using (RijndaelManaged myRijndael = new RijndaelManaged()) { // 入出力用のストリームを生成します。 using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, myRijndael.CreateEncryptor(key, iv), CryptoStreamMode.Write)) { // ストリームに暗号化するデータを書き込みます。 cs.Write(source, 0, source.Length); cs.Close(); // 暗号化されたデータを byte 配列で取得します。 byte[] destination = ms.ToArray(); ms.Close(); // byte 配列を文字列に変換して表示します。 encryptionTicket = Convert.ToBase64String(destination); } } } // メソッド正常終了を記録します。 PCSiteTraceSource.MethodSuccess(); return(encryptionTicket); } catch (Exception ex) { // アプリケーションエラーをトレースします。 PCSiteTraceSource.AppError("SingleSignOn.EncryptStringを呼び出した際のException", st, ex); throw new ApplicationException(ex.Message, ex); } }
/// <summary> /// URL生成 /// </summary> /// <remarks> /// <para>この関数は、validationUrl + "?targeturl=" + targetUrl + "&ticket=" + key の形式のURL文字列を生成します。</para> /// <para>keyは暗号化され、QueryStringとして付与されます。</para> /// </remarks> /// <param name="validationUrl">検証先URL</param> /// <param name="targetUrl">遷移先URL</param> /// <param name="key">キー</param> /// <returns>認証キーを含むリダイレクト先URL</returns> public string GenerateURL(string validationUrl, string targetUrl, string key) { // メソッド開始を記録します。 PCSiteTraceSource.MethodStart(validationUrl, targetUrl, key); // 検証先ページURLのチェック(null、空白チェック) if (string.IsNullOrEmpty(validationUrl)) { throw new ArgumentNullException("validationUrl"); } // 遷移先ページ識別子のチェック(null、空白チェック) if (string.IsNullOrEmpty(targetUrl)) { throw new ArgumentNullException("targetUrl"); } // キー値のチェック(null、空白チェック) if (string.IsNullOrEmpty(key)) { throw new ArgumentNullException("key"); } try { string returnURL = ""; PCSiteTraceSource.CheckPoint("GenerateURLメソッドチェック(ターゲットURL):" + targetUrl); // SingleSignOnTicketクラスのGentrateメソッド呼び出し string encriptTicket = SingleSignOnAuthKey.Generate(key); PCSiteTraceSource.CheckPoint("GenerateURLメソッドチェック(暗号化チケット):" + encriptTicket); // 認証キーを含むリダイレクト先URL作成 StringBuilder sb = new StringBuilder(); sb.Append(validationUrl); sb.Append("?targeturl="); // targetの値をURLエンコードします。 sb.Append(System.Web.HttpUtility.UrlEncode(targetUrl)); sb.Append("&ticket="); // ase64でエンコードした時に「+、/」が入るためURLエンコードします。 sb.Append(System.Web.HttpUtility.UrlEncode(encriptTicket)); returnURL = sb.ToString(); PCSiteTraceSource.CheckPoint("GenerateURLメソッドチェック(ReturnUrl):" + returnURL); // メソッド正常終了を記録します。 PCSiteTraceSource.MethodSuccess(); return(returnURL); } catch (Exception ex) { // アプリケーションエラーをトレースします。 PCSiteTraceSource.AppError("SingleSignOn.GenerateURLを呼び出した際のException", validationUrl, targetUrl, key, ex); throw new ApplicationException(ex.Message, ex); } }
/// <summary> /// 認証キー検証 /// </summary> /// <param name="authenticationKey">認証キー</param> /// <returns>キー値</returns> public string Validate(string authenticationKey) { // 認証キーのチェック(null、空白チェック) if (authenticationKey == null || authenticationKey == "") { throw new ArgumentNullException("authenticationKey"); } // メソッド開始を記録します。 PCSiteTraceSource.MethodStart(authenticationKey); try { string key; // 復号化メソッド呼び出し後、キー情報の取り出し string[] condition = SingleSignOn.DecryptString(authenticationKey).Split(",".ToCharArray()); PCSiteTraceSource.CheckPoint("Validateメソッドチェック(キー):" + condition[0]); PCSiteTraceSource.CheckPoint("Validateメソッドチェック(チケット作成時間):" + condition[1]); PCSiteTraceSource.CheckPoint("Validateメソッドチェック(チケット有効期限):" + condition[2]); // 認証キー作成時間を取得 DateTime dt = Convert.ToDateTime(condition[1]); // 有効期限チェック:システム日付<認証キー作成時+ 有効期限(秒) if (DateTime.Now < dt.AddSeconds(Convert.ToDouble(condition[2]))) { key = condition[0]; } else { key = null; } PCSiteTraceSource.CheckPoint("Validateメソッドチェック(return値):" + key); // メソッド正常終了を記録します。 PCSiteTraceSource.MethodSuccess(); return(key); } catch (Exception ex) { // アプリケーションエラーをトレースします。 PCSiteTraceSource.AppError("SingleSignOnTicket.Validateを呼び出した際のException", authenticationKey, ex); throw new ApplicationException(ex.Message, ex); } }
/// <summary> /// UseCheckBxCookie 関数 /// </summary> /// <param name="UCheckFlg">保持フラグ</param> /// <param name="userid">ユーザーID</param> public static void UseCheckBxCookie(bool UCheckFlg, string userid) { PCSiteTraceSource.MethodStart(); // ユーザーIDの保持チェックボックスをCookieに反映 HttpCookie kie; PCSiteTraceSource.CheckPoint("UCheckFlg", UCheckFlg.ToString()); try { if (UCheckFlg) { // チェックフラグ kie = new HttpCookie("ckUSEFLG"); kie.Value = "true"; kie.Expires = DateTime.Now.Add(new System.TimeSpan(365, 0, 0, 0)); HttpContext.Current.Response.Cookies.Add(kie); PCSiteTraceSource.CheckPoint("CookiesAdd", "ckUSEFLG"); // ユーザーID kie = new HttpCookie("ckTCONNECTID"); kie.Value = userid; kie.Expires = DateTime.Now.Add(new System.TimeSpan(365, 0, 0, 0)); HttpContext.Current.Response.Cookies.Add(kie); PCSiteTraceSource.CheckPoint("CookiesAdd", "ckTCONNECTID"); } else { kie = new HttpCookie("ckUSEFLG"); kie.Value = ""; kie.Expires = DateTime.Now.Add(new System.TimeSpan(-1, 0, 0, 0)); HttpContext.Current.Response.Cookies.Add(kie); PCSiteTraceSource.CheckPoint("CookiesRemove", "ckUSEFLG"); } } catch (Exception ex) { PCSiteTraceSource.MethodFailure(ex.Message); } PCSiteTraceSource.MethodSuccess(); }
/// <summary> /// コンストラクタ /// </summary> public LoginProcess() { PCSiteTraceSource.MethodStart(); // メンバ初期化 if (_SessionKeyList.Count == 0) { lock (_SessionKeyList) { if (_SessionKeyList.Count == 0) { _SessionKeyList.AddRange( typeof(SessionKey).GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static) .Select(t => t.GetValue(null).ToString())); } } } SecurityAuth = new AuthenticationDataSet(); PCSiteTraceSource.MethodSuccess(); }
/// <summary> /// GetRoles 関数 /// </summary> /// <returns> /// <dl> /// <dt>ロール文字</dt> /// <dd>戻り値 車載機モデルのロール文字列 /// </dd> /// </dl> /// </returns> private static string GetRoles() { PCSiteTraceSource.MethodStart(); string ret = ""; try { var dataset = HttpContext.Current.Session["Toyota.Gbook.WebSite.UserDataSet"] as Toyota.Gbook.WebSite.Security.DataTransferObject.ResultCDAuthenticationUserDataSet; if (dataset != null) { if (dataset.CarInformation.First().IsTConnectNavi&& HttpContext.Current.Session["Toyota.Gbook.WebSite.IsTerminatedUser"] != null) { if ((bool)HttpContext.Current.Session["Toyota.Gbook.WebSite.IsTerminatedUser"]) { ret = Constants.ROLE.ROLE_TCONNECT_EXIT; return(ret); } else { ret = Constants.ROLE.ROLE_TCONNECT; return(ret); } } } } catch (Exception ex) { PCSiteTraceSource.MethodFailure(ex.Message); } PCSiteTraceSource.CheckPoint("return", ret); PCSiteTraceSource.MethodSuccess(); return(ret); }
/// <summary> /// TicketCookieCreate 関数 /// </summary> public static void TicketCookieCreate() { PCSiteTraceSource.MethodStart(); // 認証チケットの発行 try { // ユーザーのロール文字設定 string roles = GetRoles(); PCSiteTraceSource.CheckPoint("roles", roles); // チケット作成 FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket( 1, HttpContext.Current.Session[Constants.PCSiteNameSpace + ".InternalMemberId"].ToString(), DateTime.Now, DateTime.Now.AddMinutes(Convert.ToDouble(Config.Item[Constants.PCSiteNameSpace + ".FormsAuthentication.TicketTime"].ToString())), false, roles); // チケットのCookie暗号化 string encryptedTicket = FormsAuthentication.Encrypt(authTicket); PCSiteTraceSource.CheckPoint("encryptedTicket", encryptedTicket); // チケットのCookie生成 HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); authCookie.Path = FormsAuthentication.FormsCookiePath; HttpContext.Current.Response.Cookies.Add(authCookie); PCSiteTraceSource.CheckPoint("CookiesAdd", FormsAuthentication.FormsCookieName, encryptedTicket, FormsAuthentication.FormsCookiePath); } catch (Exception ex) { PCSiteTraceSource.MethodFailure(ex.Message); } PCSiteTraceSource.MethodSuccess(); }
/// <summary> /// 暗号化キー、初期ベクター作成 /// </summary> /// <param name="key">キー</param> /// <param name="iv">初期ベクター</param> /// <dl> /// <dt>正常終了ケース</dt> /// <dd>キー、初期ベクターが返ります。</dd> /// <dt>エラーケース</dt> /// <dd>暗号化キー、初期ベクターの取得に失敗した場合、Abort扱いとします。 /// </dd> /// </dl> private static void GenerateKey(ref byte[] key, ref byte[] iv) { // メソッド開始を記録します。 PCSiteTraceSource.MethodStart(); try { // machine.confingから暗号化キーを取得します。 string key_temp = Config.Item["Toyota.Gbook.WebSite.SingleSignOn.TicketEncryptionKey"]; // 文字列をバイト型に変換する。 key = new byte[SingleSignOn.EncryptTicketKeyIndex]; for (int i = 0, j = 0; j < SingleSignOn.EncryptTicketKeyIndex; i += 2, j++) { key[j] = Convert.ToByte(key_temp.Substring(i, 2), 16); } // machine.confingから初期ベクターを取得します。 string iv_temp = Config.Item["Toyota.Gbook.WebSite.SingleSignOn.TicketEncryptionIV"]; // 文字列をバイト型に変換する。 iv = new byte[SingleSignOn.EncryptTicketIVIndex]; for (int i = 0, j = 0; j < SingleSignOn.EncryptTicketIVIndex; i += 2, j++) { iv[j] = Convert.ToByte(key_temp.Substring(i, 2), 16); } // メソッド正常終了を記録します。 PCSiteTraceSource.MethodSuccess(); } catch (Exception ex) { // アプリケーションエラーをトレースします。 PCSiteTraceSource.AppError("SingleSignOn.GenerateKeyを呼び出した際のException", key, iv, ex); throw new ApplicationException(ex.Message, ex); } }
/// <summary> /// CheckAuthenticationTicket 関数 /// </summary> /// <returns> /// <dl> /// <dt>チケット在りケース</dt> /// <dd>戻り値 暗号解除したFormsAuthenticationTicket /// Cookieから認証チケット名の値を取り出し、暗号解除を行う。 /// </dd> /// /// <dt>チケット無しケース</dt> /// <dd>戻り値 null</dd> /// </dl> /// </returns> public static FormsAuthenticationTicket CheckAuthenticationTicket() { PCSiteTraceSource.MethodStart(); HttpCookie AuthenticationCookie = null; FormsAuthenticationTicket ret = null; // 認証チケット名のCookieを調べる try { AuthenticationCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; } catch (Exception ex) { AuthenticationCookie = null; PCSiteTraceSource.MethodFailure(ex.Message); } if (AuthenticationCookie != null) { // Cookie値を復号化 try { ret = FormsAuthentication.Decrypt(AuthenticationCookie.Value); } catch (Exception ex) { // 不正チケット ret = null; PCSiteTraceSource.MethodFailure(ex.Message); } } PCSiteTraceSource.MethodSuccess(); return(ret); }
/// <summary> /// 認証キー生成 /// </summary> /// <param name="key">キー値</param> /// <returns>認証キー</returns> internal static string Generate(string key) { // キー値のチェック(null、空白チェック) if (key == null || key == "") { throw new ArgumentNullException("key"); } // メソッド開始を記録します。 PCSiteTraceSource.MethodStart(key); try { // machine.confingから有効期限(秒)を取得します。 string ExpirationTime = Config.Item["Toyota.Gbook.WebSite.SingleSignOn.ExpirationTime"]; StringBuilder sb = new StringBuilder(); sb.Append(key); sb.Append(","); sb.Append(Toyota.Gbook.WebSite.Common.JapaneseDateTime.Now.ToString()); sb.Append(","); sb.Append(ExpirationTime); // メソッド正常終了を記録します。 PCSiteTraceSource.MethodSuccess(); // 暗号化メソッド呼び出し return(SingleSignOn.EncryptString(sb.ToString())); } catch (Exception ex) { // アプリケーションエラーをトレースします。 PCSiteTraceSource.AppError("SingleSignOnTicket.Generateを呼び出した際のException", key, ex); throw new ApplicationException(ex.Message, ex); } }
/// <summary> /// 認可APIの結果をDataSetに格納にし、認証結果をboolで返却します。 /// </summary> /// <param name="userDataSet">認証結果のデータセット</param> public bool AuthTConnectNavi(ResultCDAuthenticationUserDataSet userDataSet) { var auth = new Toyota.Gbook.WebSite.Security.Control.Authentication(); bool isTConnectNavi; try { isTConnectNavi = auth.SetIsTConnectNaviFlag(userDataSet); // 認証インタフェース処理結果コード SecurityResultCode = userDataSet.ReturnInformation[0].ResultCD; // T-ConnectNavi判定結果 if (!userDataSet.CarInformation[0].IsIsTConnectNaviNull()) { IsTConnectNavi = userDataSet.CarInformation[0].IsTConnectNavi; isTConnectNavi = (bool)IsTConnectNavi; } if (!isTConnectNavi) { // 143:G-BOOK未契約 isTConnectNavi = SecurityResultCode == GBOOK_UN_CONTRACT; } if (isTConnectNavi) { // 認証OK // 接続区分巻き替え for (int i = 0; i < userDataSet.CarInformation.Count; i++) { string conn = userDataSet.CarInformation[i].ConnectDivision; if (conn == SECURITY_DCM_CONNECT_VALUE) { userDataSet.CarInformation[i].ConnectDivision = Common.Constants.ConnectDCM; } else if (conn == SECURITY_MOBILE_PHONE_CONNECT_VALUE) { userDataSet.CarInformation[i].ConnectDivision = Common.Constants.ConnectMobilePhone; } } // セッション値設定 // 1件目のデータを取得する(2件以上のデータが存在することは想定外) var carInfo = userDataSet.CarInformation[0]; var memberInfo = userDataSet.MemberInformation[0]; HttpContext.Current.Session[SessionKey.USERDATASET] = userDataSet.Copy(); HttpContext.Current.Session[SessionKey.SERVICE_DIVISION] = carInfo.ServiceDivision; HttpContext.Current.Session[SessionKey.GBML_VERSION] = carInfo.GBML_VERSION; HttpContext.Current.Session[SessionKey.CONNECT_DIVISION] = carInfo.ConnectDivision; HttpContext.Current.Session[SessionKey.TCONNECT_ID] = memberInfo.TConnectId; HttpContext.Current.Session[SessionKey.PASSWORD] = memberInfo.Password; HttpContext.Current.Session[SessionKey.INTERNAL_MEMBER_ID] = memberInfo.InternalMemberId; HttpContext.Current.Session[SessionKey.MEMBER_DIVISION] = memberInfo.MemberDivision; HttpContext.Current.Session[SessionKey.IS_PRESITE_USER] = userDataSet.MemberInformation[0].PreSiteMemberFlag == "1"; // "1"=true // ESPoサイトへ渡すSession情報を格納 HttpContext.Current.Session[SessionKey.ESPO_MODEL] = Constants.MODEL.MODEL_13; HttpContext.Current.Session[SessionKey.IS_TERMINATED_USER] = SecurityResultCode == GBOOK_UN_CONTRACT; } else { // 認証失敗 _SessionKeyList.ForEach( key => { if (HttpContext.Current.Session[key] != null) { HttpContext.Current.Session.Remove(key); } }); } } catch (ApplicationException) { _SessionKeyList.ForEach( key => { if (HttpContext.Current.Session[key] != null) { HttpContext.Current.Session.Remove(key); } }); // そのままthrow throw; } catch (Exception ex) { PCSiteTraceSource.AppError(ex.Message); _SessionKeyList.ForEach( key => { if (HttpContext.Current.Session[key] != null) { HttpContext.Current.Session.Remove(key); } }); throw new ApplicationException(ex.Message, ex); } PCSiteTraceSource.MethodSuccess(); return(isTConnectNavi); }