基于模型属性ASP.NET MVC 4授权用户

时间:2014-08-05 18:34:40

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

我试图阻止用户删除,除非他们创建了模型。 (我的模型存储了他们的创建者的名字)现在用户点击"删除"按钮将它们带到删除页面,然后单击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);
     ...

4 个答案:

答案 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>}}