示例#1
0
        /// <summary>
        /// 获取加密参数的url地址
        /// </summary>
        /// <param name="requestUrl">要请求的页面地址(含参数)</param>
        /// <param name="addSignature">是否自动加MD5签名(防止被篡改)</param>
        /// <param name="addTimestamp">是否自动加时间戳(DateTime.Now.Ticks)</param>
        /// <param name="encryptPassword">16个字母或数字组成的密钥(AES),如果为null或空字符串则不对参数进行加密</param>
        /// <param name="signatureValue">签名字串(输出参数)</param>
        /// <param name="timestampValue">时间戳(输出参数)</param>
        /// <returns>加密参数的url地址</returns>
        public static string GetSecureUrl(string requestUrlWithParameters, string signatureExt, string encryptPassword, out string signatureValue, out DateTime timestampValue)
        {
            if (requestUrlWithParameters == null)
            {
                requestUrlWithParameters = string.Empty;
            }

            Dictionary <string, string> parameters = null;

            string[] query = requestUrlWithParameters.Split('?');
            if (query.Length > 1)
            {
                parameters = WebUrlHelper.ParseQueryString(query[1]).ToDictionary();
            }

            return(GetSecureUrl(query[0], parameters, signatureExt, encryptPassword, out signatureValue, out timestampValue));
        }
示例#2
0
        /// <summary>
        /// 通过加密参数的url地址获取其中的参数
        /// </summary>
        /// <param name="secureUrl">加密参数的url地址或querystring部分</param>
        /// <param name="encryptPassword">16位字母或数字组成的解密密钥(AES)</param>
        /// <param name="errorCode">错误代码:0-成功,1-无效url地址,2-密钥为空,3-解密失败,4-签名无效,5-时间已过期</param>
        /// <returns>参数</returns>
        public static Dictionary <string, string> GetSecureParameters(string secureUrl, string signatureExt, string encryptPassword, int expireSeconds, out int errorCode)
        {
            string   signatureValue = null;
            DateTime timestampValue = DateTime.MinValue;

            errorCode = 0;

            Dictionary <string, string> parameters = new Dictionary <string, string>();

            if (string.IsNullOrEmpty(secureUrl))
            {
                errorCode = 1;//无效地址
                return(null);
            }

            if (secureUrl.IndexOf('?') != -1)
            {
                secureUrl = secureUrl.Split('?')[1];
            }

            if (secureUrl.IndexOf('=') == -1)
            {
                secureUrl = string.Empty;
            }

            if (secureUrl.IndexOf(SECUREURL_PARAMETER_NAME + "=", StringComparison.CurrentCultureIgnoreCase) != -1)
            {
                if (string.IsNullOrEmpty(encryptPassword))
                {
                    errorCode = 2;//密码无效
                    return(null);
                }
                try
                {
                    string[] tmp1 = secureUrl.Split('&');
                    string[] tmp2 = null;
                    foreach (string item in tmp1)
                    {
                        tmp2 = item.Split('=');
                        if (tmp2.Length == 2 && tmp2[0] == SECUREURL_PARAMETER_NAME)
                        {
                            secureUrl = tmp2[1];
                            break;
                        }
                    }
                    secureUrl = Encoding.UTF8.GetString(
                        SecurityHelper.AESDecrypt(HttpServerUtility.UrlTokenDecode(secureUrl), encryptPassword)
                        ).Replace("\0", string.Empty);
                }
                catch
                {
                    errorCode = 3;//解密失败
                    return(null);
                }
            }

            NameValueCollection nvp = WebUrlHelper.ParseQueryString(secureUrl);
            string tmp = null;

            for (int i = 0; i < nvp.Count; i++)
            {
                tmp = nvp.GetKey(i);
                if ("aspxautodetectcookiesupport".Equals(tmp, StringComparison.CurrentCultureIgnoreCase))
                {
                    continue;
                }
                else if (SECUREURL_SIGNATURE_NAME.Equals(tmp, StringComparison.CurrentCultureIgnoreCase))
                {
                    signatureValue = nvp.Get(i).ToUpper();
                    continue;
                }
                else if (SECUREURL_TIMESTAMP_NAME.Equals(tmp, StringComparison.CurrentCultureIgnoreCase))
                {
                    timestampValue = new DateTime(nvp.Get(i).ToLong());
                    if (Math.Abs((timestampValue - DateTime.Now).TotalSeconds) > expireSeconds)
                    {
                        errorCode = 4;//时间已过期
                        return(null);
                    }
                }
                parameters.Add(nvp.GetKey(i), nvp.Get(i));
            }


            List <KeyValuePair <string, string> > orderedParameters = new List <KeyValuePair <string, string> >(parameters);

            orderedParameters.Sort(delegate(KeyValuePair <string, string> a, KeyValuePair <string, string> b)
            {
                return(a.Key.CompareTo(b.Key));
            });

            string paramNVP = orderedParameters.GetNvpString(false);

            string newSignature = null;

            if (paramNVP.Length > 0)
            {
                newSignature = SecurityHelper.MD5Encrypt(paramNVP + signatureExt).ToUpper();
            }
            if (signatureValue != null && signatureValue != newSignature)
            {
                errorCode = 5;//签名无效
            }

            return(parameters);
        }