我怎样才能隐藏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

上一篇: how can i hide ID in URL with asp.net MVC4

下一篇: Set parameters with HTTP POST in Apex