我的模型的属性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)时,可能会发生这种情况。
答案 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);
}