基于模型属性对用户进行授权.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);
...
最简单的方法是用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>}}