对用户的基于角色的访问控制

时间:2015-05-12 05:45:19

标签: c# entity-framework asp.net-mvc-4 asp.net-identity user-roles

我有一个使用Entity Framework的MVC 4.0应用程序。

我有一个USER表,角色表,类型表。

角色可以是两个:AdministratorUser

类型可以是8:无,Admin, Asst.Admin, ......

所以我想根据下面的类型允许访问不同的页面:

1)定义的类型:

None    Con     Acc     Rec     St      Fr      Admin  AsAd  ( <-- Types)
----------------------------------------------------------

1.a)更新客户:

None    None    None    None    Edit    View    Full  Full  ( <-- Roles)

1.b)新客户:

None    None    None    View    View    Edit    Full  Full  ( <-- Roles)

那么如何实现呢?

1 个答案:

答案 0 :(得分:1)

您可以使用AuthorizeAttribute实现此目的:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class ActionPermissionAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
        var actionName = filterContext.ActionDescriptor.ActionName;

将此属性添加到您需要授权的所有操作中 - 在控制器上添加使这更容易,甚至创建一个继承Controller的基础控制器,然后从中继承所有控制器。

然后,您可以将控制器+操作与角色存储在DB

        // get allowed groups for this controller+action from the database (cache this)
        // get which AD groups the current user is in (or get from the DB etc)
        var userGroups = HttpContext.Current.Request.LogonUserIdentity.Groups
                         .Translate(typeof(System.Security.Principal.NTAccount))
        // check if user in in required group 

如果您确实希望在每个操作的代码中定义权限,那么只需根据需要向属性和属性构造函数添加属性。

我没有完全理解你的角色与类型,但在MVC中,一切都是一个动作(方法)所以你锁定了个别动作(没有&#39;编辑&只是一个动作叫做编辑&#39;)。