我怎样才能隐藏ID与ASP.NET MVC4的URL
我的网址
http://www.domain.com/Products/{Alias}-{ID}
和我的路线
routes.MapRoute(
name: "ProductDetail",
url: "Products/{Alias}-{detailId}",
defaults: new { controller = "Products", action = "ProductDetail", id = UrlParameter.Optional }
);
在控制器中
public ActionResult ProductDetail(int? detailId)
{
var pro = db.Products.Find(detailId);
if (pro == null)
{
return RedirectToAction("Index", "NotFound");
}
return View(pro);
}
现在,我想在我的URL中隐藏ID
http://www.domain.com/Products/{Alias}
我怎样才能做到这一点
简答
不可能做你想做的事。 如果你想从你的控制器访问detailId
,你必须将detailId
作为URL的一部分传递 - 你不能访问不存在的东西。
长答案
还有其他方法detailId
从用户处“隐藏” detailId
,这里有一些建议:
1.使用别名代替:
您可以一起移除detailId
并改为使用Alias
值。 然而,这将要求Alias
值对您要查询的产品是唯一的,并且所需的更改可能如下所示:
routes.MapRoute(
//..
url: "Products/{Alias}",
//..
);
public ActionResult ProductDetail(string Alias)
{
var pro = db.Products.FindByAlias(Alias);
//...
}
2.使用POST请求:
另一种解决方案将有效地隐藏URL中的detailId
,但仍然允许将值传递给控制器,方法是使用POST请求,其中参数值将在POST请求正文中指定。
然而,这样做的缺点是您不能简单地为用户提供点击的URL,并且在您的网站中编码链接需要更多的努力。 通常在MVC中,POST请求在提交表单时发生,并且您也可以使用javascript ajax调用执行POST请求。
这个答案有点太多了,所以如果你有兴趣,然后做一些研究,比如这个问题,或者这里的一些信息。
3.加密detailId值:
现在这个选项不会隐藏URL的detailId
,但是如果你担心目前的ID太用户友好,那么你可以'加密'(松散地使用)值。 例如,您可以将其转换为base64字符串,然后返回到控制器中的int。 这会给你一个像这样的URL:
http://www.domain.com/Products/{Alias}-MQ%3D%3D
这个URL代表1
作为detailId
并且如果使用此方法,则必须确保URL对您的值进行编码/解码。
在这种情况下,Base64转换并不真正“加密”它,任何半精明的用户都会注意到这一点,并可以避开它。 但是,如果您想采用这种方法,您可以轻松使用更安全的双向加密算法,即只有服务器知道加密/解密密钥的方法。 这里的缺点是只有服务器能够为您的用户生成有效的URL来“点击”。
在这一点上,值得考虑的是,如果您担心URL包含简单的数字ID会对用户非常友好,那么问题是:您为什么在意?
如果您担心用户可以简单地更改detailId
值,然后访问他们应该有权访问的产品,那么您在安全性方面存在更大的问题。 如果是这种情况,那么您的控制器应负责任地进行验证,以确定用户是否有权访问他们尝试访问的产品,然后采取相应措施。
所有安全检查和验证都应该在服务器端进行处理,决不要依赖于您的客户端代码或用户操作来为您执行。
链接地址: http://www.djcxy.com/p/41327.html