如何在MVC 5中限制对某些视图和操作的访问?

6
我有三个模型,它们分别叫做Category、Subcategory和Service。对于每个模型,我都使用Entity Framework创建了一个控制器,并生成了相应的视图。因此,我为每个模型都有单独的Create、Delete、Edit、Detail和Index视图。重点是,我还在ApplicationUser类中添加了一个属性,用来检查用户是否为管理员。换句话说,我添加了这个属性:
public bool IsAdmin { get; set; }

那么,问题在于我想检查用户是否是管理员,并据此采取行动。如果用户是管理员,我希望他/她能够查看这些视图,并通过这些视图简单地操作数据(使用控制器)。但是,如果他/她不是管理员,我想显示一条消息,说明他/她没有权限查看这些页面或更改数据。在MVC中如何实现呢?是否可能?

1个回答

27

首先,你的做法是错误的。虽然你可以在用户类上使用属性来实现你想要的功能,但你基本上需要重新实现MVC和Identity已经提供给你的功能。

因此,我不想让你继续深入这个问题,而是要拉你回来。首先,“管理员”状态应该是一种角色。如果一个用户是管理员,只需给他们赋予“Admin”或“Administrator”或任何你想要称呼它的角色。

然后,在你的控制器/操作中,你可以使用Authorize属性并指定可接受角色的列表。例如,以下代码将限制整个控制器仅对那些具有“Admin”角色的用户可用:

[Authorize(Roles = "Admin")]
public class FooController : Controller

如果控制器中有特定的操作,任何人都可以访问,无论是否已登录,您仍然可以保护整个控制器,但在相关操作上使用 AllowAnonymous

[Authorize(Roles = "Admin")]
public class FooController : Controller
{
    [AllowAnonymous]
    public ActionResult UnprotectedAction()
    {
        ...
    }
}

您也可以直接在操作中添加Authorize属性:

[Authorize(Roles = "Admin")]
public ActionResult AdminOnlyAction()
{
    ...
}

感谢您的精彩回答! - user1726549
喜欢这个优美的答案。 - Hemal
喜欢这个优美的答案。 - acb91

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接