Beispiel #1
0
        /// <summary>
        /// URL生成
        /// </summary>
        /// <remarks>
        /// <para>この関数は、validationUrl + "?targeturl=" + targetUrl + "&amp;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);
            }
        }
Beispiel #2
0
        /// <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);
            }
        }
Beispiel #3
0
        /// <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);
     }
 }
Beispiel #6
0
        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);
            }
        }
Beispiel #7
0
        /// <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);
            }
        }
Beispiel #8
0
        /// <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);
            }
        }
Beispiel #9
0
        /// <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);
        }