/// <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> /// 暗号化<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> /// 認証キー検証 /// </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); } }
internal async Task MailSend(MailAddress mailAddress, string token) { PCSiteTraceSource.MethodStart(); try { var mailsender = new VerificationMailSender(new MailTemplateGateway( new Blob( Config.Item["Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString"], Config.Item["Toyota.Gbook.WebSite.MailTemplate.ContainerName"], RetryPolicies.NoRetry()))); await mailsender.SendPasswordReminderMail(mailAddress, token); } catch (Exception ex) { PCSiteTraceSource.AppError("メールGWを利用してのメール送信中に例外が発生しました。", ex); throw; } }
internal async Task MailSend(MailAddress mailAddress, List <string> internalMemberId) { PCSiteTraceSource.MethodStart(); try { var url = Config.Get <string>("Toyota.Gbook.WebSite.Mail.MailGW.Url"); var subject = Config.Get <string>("Toyota.Gbook.WebSite.IdRemind.Subject"); var mailsender = new VerificationMailSender(new MailTemplateGateway( new Blob( Config.Item["Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString"], Config.Item["Toyota.Gbook.WebSite.MailTemplate.ContainerName"], RetryPolicies.NoRetry()))); await mailsender.SendIdReminderMail(mailAddress, internalMemberId); } catch (Exception ex) { PCSiteTraceSource.AppError("メールGWを利用してのメール送信中に例外が発生しました。", ex); } }
public void IsPersonalMember(string internalMemberId) { Toyota.Gbook.WebSite.DataAccess.Member.Entity.MemberInformationEntity mEntity = Toyota.Gbook.WebSite.DataAccess.Member.Control.Member.GetMemberInfo(internalMemberId); var memberDivisionPersonal = "1"; if (string.IsNullOrEmpty(mEntity.MemberDivision)) { PCSiteTraceSource.AppError("会員区分が取得できませんでした。内部会員Id:", internalMemberId); throw new UserNotFoundException(internalMemberId, "個人", "会員区分が取得できませんでした。"); } if (mEntity.MemberDivision == "0") { throw new UnexpectedMemberDivisionException(internalMemberId, "個人", "会員区分「0:ID、Passのみ」が返却されました。"); } else if (mEntity.MemberDivision != memberDivisionPersonal) { var memberDivision = string.Format("入力された会員区分:{0}, APIのレスポンスから取得した会員区分: {1}", "個人", ""); throw new UserNotFoundException(internalMemberId, "個人", "指定されたユーザーが存在しません。" + memberDivision); } }
/// <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> /// 認証キー生成 /// </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); }