1

你好,经验丰富的开发人员!

我想知道是否有可能以某种方式覆盖 .Net Request.QueryString 对象?如果无需创建我自己的 HTTP 模块就可以做到这一点,那就太好了。

我的任务是 RSA(1024) 加密我的应用程序中的所有查询字符串。但是,该应用程序已经构建,并且有很多地方正在设置查询字符串,所以理想情况下我想做一个全局更改,将解密查询并将其放在正常的 Request.QueryString 中,以便不必更改我的到处都是代码,也许可以将它传递给我团队中的其他开发人员,他们也不必更改他们的代码。

现在,我已经构建了加密对象并使用 SessionID 进行盐分,以使每个会话的密钥都是唯一的。我还尝试在 Global.asax 中拦截 HTTP 请求,以便用解密的查询重写请求路径,但是,这是一个失败,因为在这些页面上执行的任何回发都会将解密的查询字符串放回 POST,我显然不想要。

所以现在我正处于一个阶段,我不想重写路径,而是在全局级别拦截或覆盖 Request.QueryString 对象,并在调用 this[key] 时使用我的解密方法,因此,不必停止使用 Request.QueryString。然而,在网上搜索了几个小时后,我找不到一个关于如何做到这一点的例子......

如果有人可以帮助我解决这个问题,我将不胜感激!

4

1 回答 1

0

我认为最简单的方法是使用扩展方法。也许是这样的:

    class Program 
{
    static void Main() 
    {
        var decryptedValue = HttpContext.Current.Request.DecryptQueryStringParam("myParam");
    }
}

public static class HttpRequestExtensions 
{
    public static string DecryptQueryStringParam(this HttpRequest extendee, string name)
    {
        // do stuff to decrypt
        return DecryptMethodStub(extendee.QueryString[name]);
    }

    private string DecryptMethodStub(string queryString)
    {
        return "something decrypted the string";
    }
}

请注意,上面的 Program 类仅用于说明目的......实际上,您可以在 asp.net Web 表单页面或 MVC 控制器的正文中调用 Request.{ExtensionMethod},这些控制器已经通过以下方式提供对 HttpRequest 对象的直接访问请求属性。

以下是有关扩展的一些信息:

http://msdn.microsoft.com/en-us/library/bb383977.aspx

于 2013-12-19T20:00:25.227 回答