大家好,经验丰富的开发人员朋友们!
我想知道是否有可能以某种方式覆盖.Net Request.QueryString对象?如果不需要创建自己的HTTP模块就能做到这一点,那就太好了。
我的任务是使用RSA(1024)对应用程序中的所有查询字符串进行加密。然而,应用程序已经构建,并且有很多地方设置了查询字符串,所以理想情况下,我希望进行全局更改,将查询解密并将其放入普通的Request.QueryString中,这样就不必到处更改代码,也许还可以将其传递给团队中的其他开发人员,他们也不必更改代码。
现在,我已经构建了加密对象,并使用盐的SessionID使每个会话的密钥是唯一的。我也尝试过在Global.asax中截取HTTP请求,以便用解密的查询重写请求路径,然而,这是失败的,因为在这些页面上执行的任何回发都会将解密的查询字符串放回POST中,这显然不是我想要的。
因此,现在我不想重写路径,而是在全局级别上拦截或覆盖Request.QueryString对象,并在调用此密钥时在那里使用我的解密方法,从而再次不必停止使用Request.QueryString。然而,在网上搜索了几个小时后,我找不到一个关于如何做到这一点的例子……
如果有人能帮我解决这个问题,我将不胜感激!
发布于 2013-12-20 04:00:25
我认为最简单的方法是使用扩展方法。可能是这样的:
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类仅用于说明目的...实际上,您需要在MVC窗体页面或asp.net控制器的主体中调用Request.{ExtensionMethod},这些控件已经通过Request属性提供了对HttpRequest对象的直接访问。
以下是关于扩展的一些信息:
http://msdn.microsoft.com/en-us/library/bb383977.aspx
https://stackoverflow.com/questions/15450505
复制相似问题