解密Querystring参数并映射到控制器

本文关键字:控制器 映射 Querystring 参数 解密 | 更新日期: 2023-09-27 18:08:39

我有一个控制器方法,像

public ViewResult MyMethod(long id, string pId)
{
}

我有一个查询字符串,像

?'id=' + 10 + '&pId=' + 15

我想用某种加密算法对它进行加密之后我得到了某种格式的查询字符串,比如

gaiSXZyTAq6Z0a5TzsrdG2LjIj0moe2m4D0qQiG7zuQ=

我在开始请求中从Global.asax解密它,能够解密和设置查询字符串所有密钥,但控制器无法获得其参数值

  protected void Application_BeginRequest(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(Convert.ToString(Request.QueryString)))
            {
                var newQueryString = SecurityEncryption.DecryptionValue(HttpUtility.UrlDecode(Convert.ToString(Request.QueryString)).Replace(" ", "+"));
                Request.QueryString.AllKeys[0] = newQueryString;
            } 
        }

我想控制器方法将得到它的参数值,我怎么才能实现这一点?

请大家帮帮我。

解密Querystring参数并映射到控制器

我找到了解决方案,我解密了我的基础控制器

public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
     var queryStringQ =  Server.UrlDecode(filterContext.HttpContext.Request.QueryString["q"]);
 if (!string.IsNullOrEmpty(queryStringQ))
        {
            // Decrypt query string value
            var queryParams = DecryptionMethod(queryStringQ);
        }
 }

是的,我们能够修复global.asax

protected void Application_BeginRequest(object sender, EventArgs e)
{
    if (!string.IsNullOrEmpty(Convert.ToString(Request.QueryString)))
    {
        var newQueryString = SecurityEncryption.DecryptionValue(HttpUtility.UrlDecode(Convert.ToString(Request.QueryString)).Replace(" ", "+"));
 
        PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
        isreadonly.SetValue(this.Request.QueryString, false, null);
        this.Request.QueryString.Set(queryString, newQueryString );
        isreadonly.SetValue(this.Request.QueryString, true, null);
    } 
}