模型绑定器解密字符串并转换为int

时间:2013-11-21 16:14:15

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我的模型的属性id类型为int

我在id之类的网址中传递了Detail/20来获取数据。但是,现在我的客户说他们不想看到id,因为任何人都可以修改并查看其他记录。

现在,我决定对其进行加密和解密,并将其分配给另一个属性:encId

public ActionResult List()
{
    foreach(Employee e in empList)
    {
        e.encId = MyUtil.Encrypt(id,"sessionid");    
    }

    return View(empList);
}

最后,我将我的网址设为Detail/WOgV16ZKsShQY4nF3REcNQ==/

现在,我只需将其解密回原始表单并将其分配给id类型的属性int

public ActionResult Detail(int id) //don't want (string id)
{

}

如何编写解密并将其转换为有效id的模型绑定器?此外,如果发生任何错误/异常,则必须重定向到404错误页面。当用户手动编辑url中的一些无用文本(加密id)时,可能会发生这种情况。

1 个答案:

答案 0 :(得分:1)

首先,这不是保护您的网站和数据的方法。请查看Security Through Obscurity的问题。您最好定义每个员工记录的权限集以及谁可以编辑或不编辑它们。这样的例子看起来像这样:

public ActionResult Detail(int id)
{
    if(MySecurityProvider.CanView(id, HttpContext.Current.User.Identity.Name){
        return View();
    }
    Return RedirectToAction("PermissionIssue", "Errors");
}

话虽如此,要继续你所在的路径,只需在动作结果中进行解密。

public ActionResult Detail(string Id)
{
    int actualId;
    try{
       actualId = MyUtil.Decrypt(id);
    }catch(Exception e){
         //someone mucked with my encryption string
         RedirectToAction("SomeError", "Errors");
    }
    var employee = MyEmployeeService.GetEmployeeById(actualId);
    if(employee == null){
         //This was a bad id
         RedirectToAction("NotFound", "Errors");
    }
    Return View(employee);
}