基于模型属性对用户进行授权.Net MVC 4

本文关键字:授权 Net MVC 用户 于模型 模型 属性 | 更新日期: 2023-09-27 18:16:50

我试图阻止用户能够删除,除非他们创建了模型。(我的模型存储创建者的名字)现在,用户点击"删除"按钮将他们带到删除页面,在那里他们点击deletecconfirmed按钮。如何阻止未创建模型的用户删除模型?

我知道我可以通过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);
     ...

基于模型属性对用户进行授权.Net MVC 4

最简单的方法是用SingleOrDefault代替Find,同时基于用户进行查询:

Task myData = db.MyDatas.SingleOrDefault(m => m.Id == keyId && m.CreatedBy == User.Identity.Name)

然后,用户只会得到一个非空的东西,如果他们创建它。

这里有两个可行的答案:

登录用户的MVC访问限制

创建一个自定义AuthorizationFilter来封装该检查/逻辑。

或者,你可以将它构建到db. mydata . find (keyId);

也就是说,在

,,Creator == Context.User.Identity.Name

(如果它不返回一个对象,那么当前用户没有权限删除它。)

你可以使用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
        }
    }
}

享受吧!

您需要将将要删除的模型记录的实例传递到cshtml中,然后在cshtml中执行一些基本逻辑,如{ if( Context.User.Identity.Name == model_var.user_that_created.Name){<a>Delete</a>}}