Esempio n. 1
0
        public override bool BackVerifySign(PartnerBackContext context)
        {
            NameValueCollection param = new NameValueCollection();

            param["err_code"] = context.ResponseParam.AllKeys.Contains("err_code") ? context.ResponseParam["err_code"] : "";
            if (!string.IsNullOrWhiteSpace(param["err_code"]) && !param["err_code"].Equals("0"))
            {
                param["err_msg"] = context.ResponseParam.AllKeys.Contains("err_msg") ? context.ResponseParam["err_msg"] : "";
                if (!string.IsNullOrWhiteSpace(param["err_msg"]))
                {
                    param["err_msg"] = SpecialUrlEncode(param["err_msg"]);
                }
            }
            param["login_status"] = context.ResponseParam.AllKeys.Contains("login_status") ? context.ResponseParam["login_status"] : "";
            param["kjt_user_id"]  = context.ResponseParam.AllKeys.Contains("kjt_user_id") ? context.ResponseParam["kjt_user_id"] : "";
            param["client_state"] = context.ResponseParam.AllKeys.Contains("client_state") ? context.ResponseParam["client_state"] : "";
            param["sign"]         = context.ResponseParam.AllKeys.Contains("sign") ? context.ResponseParam["sign"] : "";
            if (!string.IsNullOrWhiteSpace(param["client_state"]))
            {
                context.ReturnUrl     = param["client_state"];
                param["client_state"] = SpecialUrlEncode(param["client_state"]);
            }
            context.ResponseParam = param;

            string localSign = SignData(context);

            if (context.ResponseParam.AllKeys.Contains("sign") &&
                context.ResponseParam["sign"].ToLower().Trim().Equals(localSign.ToLower().Trim()))
            {
                return(true);
            }

            Logger.WriteLog(string.Format("验签失败,跨境通签名为:{0},本地签名:{1}", context.ResponseParam["sign"], localSign), "PassportKuajingtong", "PassportVerifySign");
            return(false);
        }
Esempio n. 2
0
        /// <summary>
        /// 第三方登录回调验签
        /// </summary>
        /// <param name="context">第三方登录回调上下文</param>
        /// <returns></returns>
        public override bool BackVerifySign(PartnerBackContext context)
        {
            string localSign = SignReturnData(context);

            context.ActionType = PassportActionType.Accept;

            if (context.ResponseParam["is_success"] == "T")
            {
                if (context.ResponseParam.AllKeys.Contains("sign") &&
                    context.ResponseParam["sign"] == localSign)
                {
                    if (VerfyNotifyID(context, context.ResponseParam["notify_id"]))
                    {
                        return(true);
                    }
                    else
                    {
                        Logger.WriteLog(string.Format("验证Notify失败,notify_id:{0}"
                                                      , context.ResponseParam["notify_id"]), "PartnerAlipay", "PassportVerifySign");
                    }
                }
            }

            Logger.WriteLog(string.Format("验签失败,支付宝签名为:{0},本地签名:{1}"
                                          , context.ResponseParam["sign"], localSign)
                            , "PartnerAlipay"
                            , "PassportVerifySign");

            return(false);
        }
Esempio n. 3
0
        /// <summary>
        /// Signs the return data.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <returns></returns>
        private string SignReturnData(PartnerBackContext context)
        {
            StringBuilder builder = new StringBuilder();

            if (context.ResponseParam != null &&
                context.ResponseParam.AllKeys != null &&
                context.ResponseParam.AllKeys.Length > 0)
            {
                List <string> allKeys = context.ResponseParam.AllKeys.OrderBy(m => m).ToList();
                foreach (string key in allKeys)
                {
                    if (key.Equals("sign", StringComparison.CurrentCultureIgnoreCase) ||
                        key.Equals("sign_type", StringComparison.CurrentCultureIgnoreCase))
                    {
                        continue;
                    }

                    builder.AppendFormat("{0}={1}&", key, context.ResponseParam[key]);
                }
            }

            string sourceData = builder.ToString().TrimEnd('&');

            sourceData += string.Format("{0}", context.PassportInfo.Parnter.AppSecret);
            string signData = GetMD5(sourceData, context.PassportInfo.Parnter.Encoding);

            //Debug模式下记录相关信息至日志
            if (context.PassportInfo.Parnter.Debug.Equals("1"))
            {
                string sourceParam = BuildStringFromNameValueCollection(context.ResponseParam);
                Logger.WriteLog(string.Format("原始值:{0},签名明文:{1},签名:{2}", sourceParam, sourceData, signData), "PartnerAlipay", "PassportSignReturnData");
            }

            return(signData);
        }
Esempio n. 4
0
        /// <summary>
        /// 第三方登录回调
        /// </summary>
        /// <param name="identify">第三方标识</param>
        /// <param name="collection">回调参数</param>
        /// <returns></returns>
        public PartnerBackResult LoginBack(string identify, NameValueCollection collection)
        {
            PartnerBackContext context = new PartnerBackContext();

            context.PartnerIdentify = identify;
            context.ResponseParam   = collection;

            Partners partner = Partners.GetInstance(context);

            if (!partner.BackVerifySign(context))
            {
                Logger.WriteLog(string.Format("第三方登录回调非法请求,第三方标识:{0}", identify), "Passport", "LoginBack");
                throw new BusinessException("登录失败!");
            }

            CustomerInfo customer = null;

            if (context.ActionType == PassportActionType.Accept)
            {
                partner.GetResponseUserInfo(context);

                customer = new CustomerInfo()
                {
                    CustomerID    = context.CustomerID,
                    CustomerName  = context.CustomerName,
                    CustomersType = (int)context.CustomerSouce,
                    InitRank      = 1,
                    Password      = "",
                    CellPhone     = context.CellPhone,
                    Email         = context.Email
                };

                var existsCustomer = CustomerFacade.GetCustomerByID(context.CustomerID);
                if (existsCustomer == null)
                {
                    int customerSysNo = LoginFacade.CreateCustomer(customer).SysNo;
                    if (customerSysNo <= 0)
                    {
                        Logger.WriteLog(string.Format("第三方登录回调注册用户失败,第三方标识:{0}", identify), "Passport", "LoginBack");
                        throw new BusinessException("第三方登录注册用户失败!");
                    }
                    customer.SysNo = customerSysNo;
                }
                else
                {
                    customer.SysNo = existsCustomer.SysNo;
                }
            }
            PartnerBackResult result = new PartnerBackResult()
            {
                Customer   = customer,
                ReturnUrl  = context.ReturnUrl,
                ActionType = context.ActionType
            };

            return(result);
        }
Esempio n. 5
0
        /// <summary>
        /// Verfies the notify identifier.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="notifyID">The notify identifier.</param>
        /// <returns></returns>
        private bool VerfyNotifyID(PartnerBackContext context, string notifyID)
        {
            string notifyURL = context.PassportInfo.Parnter.LoginUrl
                               + string.Format("?service=notify_verify&partner={0}&notify_id={1}"
                                               , context.PassportInfo.Parnter.AppID
                                               , notifyID);

            string result = Partners.HttpGetRequest(notifyURL, "utf-8");

            return(result.ToLower().Trim() == "true");
        }
Esempio n. 6
0
        public static Partners GetInstance(PartnerBackContext context)
        {
            if (context != null && !string.IsNullOrWhiteSpace(context.PartnerIdentify))
            {
                context.PassportInfo = GetPassportInfo(context.PartnerIdentify);
                if (context.PassportInfo != null && context.PassportInfo.Parnter != null)
                {
                    return(GetInstance(context.PassportInfo.Parnter.PartnerProcessor));
                }
            }

            return(null);
        }
Esempio n. 7
0
        public override void GetResponseUserInfo(PartnerBackContext context)
        {
            //第一步,获取AccessToken
            NameValueCollection postData = new NameValueCollection();

            postData.Add("client_id", context.PassportInfo.Parnter.AppID);
            postData.Add("client_secret", context.PassportInfo.Parnter.AppSecret);
            postData.Add("grant_type", "authorization_code");
            postData.Add("code", context.ResponseParam["code"]);
            postData.Add("redirect_uri", SpecialUrlEncode(BuildActionUrl(context.PassportInfo.Base.BaseUrl, context.PassportInfo.Parnter.LoginBackUrl)));
            string responseData = HttpPostRequest(context.PassportInfo.Parnter.AccessTokenUrl
                                                  , BuildStringFromNameValueCollection(postData)
                                                  , "application/x-www-form-urlencoded"
                                                  , context.PassportInfo.Parnter.Encoding);

            //Debug模式下记录相关信息至日志
            if (context.PassportInfo.Parnter.Debug.Equals("1"))
            {
                Logger.WriteLog(string.Format("获取AccessToken响应数据:{0}", responseData), "PassportSinaWeibo", "GetAccessToken");
            }

            SinaWeiboAccessToken returnData = SerializationUtility.JsonDeserialize <SinaWeiboAccessToken>(responseData);

            if (returnData == null)
            {
                throw new BusinessException("登录失败!");
            }

            //第二步,获取用户信息
            string requestParam = string.Format("access_token={0}&uid={1}",
                                                returnData.access_token,
                                                returnData.uid
                                                );

            responseData = HttpGetRequest(string.Format("{0}?{1}", context.PassportInfo.Parnter.GetUserInfoUrl, requestParam)
                                          , context.PassportInfo.Parnter.Encoding);

            //Debug模式下记录相关信息至日志
            if (context.PassportInfo.Parnter.Debug.Equals("1"))
            {
                Logger.WriteLog(string.Format("获取User响应数据:{0}", responseData), "PassportSinaWeibo", "GetUserInfo");
            }
            SinaWeiboUserInfo userInfo = SerializationUtility.JsonDeserialize <SinaWeiboUserInfo>(responseData);

            context.CustomerID    = string.Format("SinaWeibo_{0}", userInfo.id);
            context.CustomerName  = userInfo.screen_name;
            context.CustomerSouce = Enums.CustomerSourceType.Sina;
        }
Esempio n. 8
0
        public override bool BackVerifySign(PartnerBackContext context)
        {
            NameValueCollection param = new NameValueCollection();

            param["code"]         = context.ResponseParam.AllKeys.Contains("code") ? context.ResponseParam["code"] : "";
            param["state"]        = context.ResponseParam.AllKeys.Contains("state") ? context.ResponseParam["state"] : "";
            context.ResponseParam = param;
            context.ActionType    = PassportActionType.Accept;

            string localState = context.PassportInfo.Parnter.CustomProperty1;

            if (String.Equals(localState, param["state"], StringComparison.CurrentCultureIgnoreCase))
            {
                return(true);
            }
            Logger.WriteLog(string.Format("验签失败,新浪微博状态为:{0},本地状态:{1}", context.ResponseParam["state"], localState), "PassportSinaWeibo", "PassportVerifySign");
            return(false);
        }
Esempio n. 9
0
        /// <summary>
        /// 获取第三方登录回调用户信息
        /// </summary>
        /// <param name="context">第三方登录回调上下文</param>
        public override void GetResponseUserInfo(PartnerBackContext context)
        {
            string alipayUserId       = context.ResponseParam["user_id"];
            string alipayUserEmail    = context.ResponseParam["email"];
            string alipayUserRealName = context.ResponseParam["real_name"];

            alipayUserRealName = string.IsNullOrEmpty(alipayUserRealName) ? alipayUserId : alipayUserRealName;

            context.CustomerID   = string.Format("Alipay_{0}", alipayUserId);
            context.CustomerName = alipayUserRealName;
            if (alipayUserEmail.IndexOf('@') > 0)
            {
                context.Email = alipayUserEmail;
            }
            else
            {
                context.CellPhone = alipayUserEmail;
            }

            context.CustomerSouce = Enums.CustomerSourceType.AliPay;
        }
Esempio n. 10
0
        /// <summary>
        /// 第三方登录回调验签
        /// </summary>
        /// <param name="context">第三方登录回调上下文</param>
        /// <returns></returns>
        public override bool BackVerifySign(PartnerBackContext context)
        {
            context.ActionType = PassportActionType.Accept;
            NameValueCollection param = new NameValueCollection();

            param["code"]         = context.ResponseParam.AllKeys.Contains("code") ? context.ResponseParam["code"] : "";
            param["state"]        = context.ResponseParam.AllKeys.Contains("state") ? context.ResponseParam["state"] : "";
            context.ResponseParam = param;

            //如果url中有code参数,说明是获取code请求的回调,需要验证state值,防止CSRF攻击
            if (!String.IsNullOrWhiteSpace(param["code"]))
            {
                string localState = context.PassportInfo.Parnter.CustomProperty1;
                if (String.Equals(localState, param["state"], StringComparison.CurrentCultureIgnoreCase))
                {
                    return(true);
                }
                Logger.WriteLog(string.Format("验签失败,QQ状态为:{0},本地状态:{1}", context.ResponseParam["state"], localState), "PassportTencentQQ", "PassportVerifySign");
                return(false);
            }
            return(false);
        }
Esempio n. 11
0
        public override void GetResponseUserInfo(PartnerBackContext context)
        {
            int    rdm = (new Random()).Next(100000);
            string kuajingtongUserID = context.ResponseParam["kjt_user_id"];

            NameValueCollection param = new NameValueCollection();

            param["method"]       = HttpUtility.UrlEncode("user.getInfo");
            param["version"]      = HttpUtility.UrlEncode("1.0");
            param["appId"]        = HttpUtility.UrlEncode(context.PassportInfo.Parnter.AppID);
            param["timestamp"]    = GetNowTime2Timestamp();
            param["nonce"]        = rdm.ToString();
            param["kjt_user_id"]  = kuajingtongUserID;
            context.ResponseParam = param;

            string requestParam = string.Format("method={0}&version={1}&appId={2}&timestamp={3}&nonce={4}&kjt_user_id={5}&sign={6}",
                                                HttpUtility.UrlEncode("user.getInfo"), HttpUtility.UrlEncode("1.0"),
                                                HttpUtility.UrlEncode(context.PassportInfo.Parnter.AppID),
                                                GetNowTime2Timestamp(), rdm,
                                                kuajingtongUserID, SignData(context));
            string requestUrl            = string.Format("{0}?{1}", context.PassportInfo.Parnter.GetUserInfoUrl, requestParam);
            string responseData          = HttpGetRequest(requestUrl, context.PassportInfo.Parnter.Encoding);
            KuajingtongReturnData entity = SerializationUtility.JsonDeserialize <KuajingtongReturnData>(responseData);

            if (entity == null || entity.err_code.Equals("1") || !entity.err_code.Equals("0"))
            {
                Logger.WriteLog(string.Format("获取跨境通用户信息失败,原始数据:{0}", responseData), "PassportKuajingtong", "GetUserInfo");
                throw new BusinessException("用户不存在!");
            }

            context.CustomerID    = string.Format("Kuajingtong_{0}", entity.id);
            context.CustomerName  = entity.username;
            context.Email         = entity.email;
            context.IsAuth        = entity.is_real_auth;
            context.CustomerSouce = Enums.CustomerSourceType.Kuajingtong;
        }
Esempio n. 12
0
        /// <summary>
        /// 获取第三方登录回调用户信息
        /// </summary>
        /// <param name="context">第三方登录回调上下文</param>
        /// <exception cref="ECommerce.Utility.BusinessException">
        /// 登录失败!
        /// or
        /// </exception>
        public override void GetResponseUserInfo(PartnerBackContext context)
        {
            //第一步,获取AccessToken
            NameValueCollection data = new NameValueCollection();

            data.Add("client_id", context.PassportInfo.Parnter.AppID);
            data.Add("client_secret", context.PassportInfo.Parnter.AppSecret);
            data.Add("grant_type", "authorization_code");
            data.Add("code", context.ResponseParam["code"]);
            data.Add("redirect_uri", SpecialUrlEncode(BuildActionUrl(context.PassportInfo.Base.BaseUrl, context.PassportInfo.Parnter.LoginBackUrl)));

            string tokenResult = string.Empty;
            string tokenURL    = string.Format("{0}?{1}", context.PassportInfo.Parnter.AccessTokenUrl, BuildStringFromNameValueCollection(data));

            HttpHelper.Get(tokenURL, out tokenResult);

            //Debug模式下记录相关信息至日志
            if (context.PassportInfo.Parnter.Debug.Equals("1"))
            {
                Logger.WriteLog(string.Format("获取AccessToken响应数据:{0}", tokenResult), "PassportTencentQQ", "AccessToken");
            }

            //"access_token=7A16EECB7F4904A1D7ACF851E4B283C7&expires_in=7776000&refresh_token=BC5FC164D418609ED26DDE16F8DA5EFF"
            NameValueCollection nvc = HttpUtility.ParseQueryString(tokenResult);

            context.ResponseParam["access_token"] = nvc["access_token"];

            //第二步,用AccessToken获取OpenID

            string returnData = string.Empty;
            string opidURL    = string.Format("{0}?access_token={1}", context.PassportInfo.Parnter.OpenIDUrl, context.ResponseParam["access_token"]);

            HttpHelper.Get(opidURL, out returnData);

            //Debug模式下记录相关信息至日志
            if (context.PassportInfo.Parnter.Debug.Equals("1"))
            {
                Logger.WriteLog(string.Format("获取OpenID响应数据:{0}", returnData), "PassportTencentQQ", "GetOpenID");
            }

            //PC网站接入时,获取到用户OpenID,返回包如下:
            //callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} );
            string pattern   = "callback\\(\\s*{\\s*\"client_id\"\\s*:\\s*\"(?<client_id>\\w+)\"\\s*,\\s*\"openid\"\\s*:\\s*\"(?<openid>\\w+)\"\\s*}\\s*\\)";
            var    match     = Regex.Match(returnData, pattern);
            string client_id = string.Empty;
            string openid    = string.Empty;

            if (match != null)
            {
                client_id = match.Groups["client_id"].Value;
                openid    = match.Groups["openid"].Value;
            }
            else
            {
                Logger.WriteLog(string.Format("获取OpenID失败,{0}", returnData), "PassportTencentQQ", "GetOpenID");
                throw new BusinessException("登录失败!");
            }

            //第三步,获取用户信息
            string requestParam = string.Format("access_token={0}&oauth_consumer_key={1}&openid={2}",
                                                context.ResponseParam["access_token"],
                                                context.PassportInfo.Parnter.AppID,
                                                openid
                                                );

            string userInfoURL  = string.Format("{0}?{1}", context.PassportInfo.Parnter.GetUserInfoUrl, requestParam);
            string responseData = string.Empty;

            HttpHelper.Get(userInfoURL, out responseData);

            //Debug模式下记录相关信息至日志
            if (context.PassportInfo.Parnter.Debug.Equals("1"))
            {
                Logger.WriteLog(string.Format("获取User响应数据:{0}", responseData), "PassportTencentQQ", "GetUserInfo");
            }

            TencentQQUserInfo userInfo = SerializationUtility.JsonDeserialize <TencentQQUserInfo>(responseData);

            if (userInfo.ret != 0)
            {
                throw new BusinessException(string.Format("登录失败! {0}", userInfo.msg));
            }

            context.CustomerID    = string.Format("TencentQQ_{0}", openid);
            context.CustomerName  = userInfo.nickname;
            context.CustomerSouce = CustomerSourceType.TencentQQ;
        }
Esempio n. 13
0
 /// <summary>
 /// 获取第三方登录回调用户信息
 /// </summary>
 /// <param name="context">第三方登录回调上下文</param>
 public abstract void GetResponseUserInfo(PartnerBackContext context);
Esempio n. 14
0
 /// <summary>
 /// 第三方登录回调验签
 /// </summary>
 /// <param name="context">第三方登录回调上下文</param>
 /// <returns></returns>
 public abstract bool BackVerifySign(PartnerBackContext context);