2014-10-08 59 views
1

我很努力地完全理解在MVC4应用程序中实现Windows身份验证和基于角色的授权方案的正确方法。当用户访问(内部网)的网站目前我有以下方法检查用户名反对对数据库表是否需要角色提供者实现?

List<string> permissionList = 
PermissionBo.GetUserPermissionsList(PermissionBo.ParseUserName(User.Identity.Name)); 
    Permissions permissions = new Permissions(permissionList); 

然后,如果状态增加了一个角色给用户对象的下列内容:

if (permissions.IsAdmin) 
    { 
     if(!Roles.RoleExists("UtilitiesToolAdmin")) 
     { 
      Roles.CreateRole("UtilitiesToolAdmin"); 
     } 
     if(!Roles.IsUserInRole(User.Identity.Name, "UtilitiesToolAdmin")) 
     { 
      Roles.AddUsersToRole(new string[] { User.Identity.Name }, "UtilitiesToolAdmin"); 
     } 

    } 

我觉得这可能是一个不正确的方式去实现这一点,但我不知道我错了。这足以开始使用授权属性,如下所示:

[Authorize(Roles="UtilitiesToolAdmin")] 
public static void Foo() 
{ 
return "Bar" 
} 

如果不是我错过了什么?

+0

使用授权属性是你应该做的。唯一不使用授权的时间是,如果您必须以编程方式确定访问权限。 – 2014-10-08 20:39:22

+0

我会尝试清除我的问题,但我知道我想使用Authorize属性,但是我不清楚如果它是“正确的”以编程方式向用户添加角色,就像我所做的那样 – Pseudonym 2014-10-08 20:40:23

回答

1

如果您所做的只是简单的角色检查,则自定义角色提供者可能有点矫枉过正(角色提供者也提供了管理角色本身的工具)。你将最终得到的是一个完整的类

throw new NotImplementedException(); 

而是,考虑创建一个自定义用户主体。 IPrincipal接口定义一个返回一个bool的IsInRole方法。这是您将放置您的自定义角色检查的地方。自定义用户主体的优点是,现在,只要在生命周期中足够早地使用自定义用户主体对象替换默认用户主体对象,现在所有内置的ASP.NET角色检查好吃的东西都应该“正常工作”。

This SO answer有我见过的使用MVC应用程序使用自定义用户主体的最佳示例之一。