我试图阻止用户删除,除非他们创建了模型。 (我的模型存储了他们的创建者的名字)现在用户点击"删除"按钮将它们带到删除页面,然后单击DeleteConfirmed按钮。如何阻止未创建模型的用户删除它?
我知道我可以使用Context.User.Identity.Name
public ActionResult Delete(int? keyId)
{
Task mydata = db.MyDatas.Find(keyId);
...
return View(mydata);
}
[HttpPost, ActionName("Delete"), Authorize(Users = @"DOMAIN\Admin1 , DOMAIN\Bread")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int keyId)
{
Task mydata = db.MyDatas.Find(keyId);
...
答案 0 :(得分:1)
这里有两个可行的答案:
MVC access restriction for logged in users
创建自定义AuthorizationFilter以封装该检查/逻辑。
或者,您可以将其构建到db.MyDatas.Find(keyId);
也就是说,添加一些效果:
&安培;&安培; Creator == Context.User.Identity.Name
(如果它没有返回对象,则当前用户无权删除它。)
答案 1 :(得分:1)
您可以使用ActionFilters,它们的用途如下:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if((string)filterContext.RouteData.Values["action"]=="Delete") //check if its delete action
{
if (db.MyDatas.Find(a=>a.ModelCreator.trim()==Context.User.Identity.Name.trim())==null)
{
Response.Redirect("~/Home"); //or whatever u want to give for unauthorized
}
}
}
享受!
答案 2 :(得分:1)
最简单的方法是使用SingleOrDefault
代替Find
,并根据用户同时进行查询:
Task myData = db.MyDatas.SingleOrDefault(m => m.Id == keyId && m.CreatedBy == User.Identity.Name)
然后,用户只有在创建它时才会获得非空的东西。
答案 3 :(得分:1)
您需要将要删除的模型记录的实例传递到您的cshtml中,然后在您的cshtml中执行一些基本逻辑,如{ if( Context.User.Identity.Name == model_var.user_that_created.Name){<a>Delete</a>}}