0

我工作在ASP.NET MVC 5的Web API 2如何使用角色与集成Windows身份验证

我已通过添加以下代码来实现网络集成Windows身份验证实现的Web应用程序。 config:

<system.web> 
    <authentication mode="Windows" /> 
</system.web> 
<system.webServer> 
    <security> 
    <authentication> 
     <windowsAuthentication enabled="true"/> 
    </authentication> 
    </security> 
</system.webServer> 

并在我的控制器上添加[Authorize]注释。

现在,我被要求根据用户的角色提供一些功能。我有一张表,我拥有用户权限,但我不知道如何创建这些角色,并将正确的权限与他们关联。

任何帮助,将不胜感激。

在此先感谢

[更新]

基于梅森的回答,我已经更新了代码位。

添加以下行的web.config:

<roleManager defaultProvider="MyRoleProvider"> 
    <providers> 
    <add 
     name="MyRoleProvider" 
     type="MyApp.App_Start.MyRoleProvider" 
     applicationName="My Tool" /> 
    </providers> 
</roleManager> 

MyRoleProvider.cs:

public class MyRoleProvider : RoleProvider 
{ 
    private MyEntities db = new MyEntities(); 

    public override void AddUsersToRoles(string[] usernames, string[] roleNames) 
    { 
     throw new NotImplementedException(); 
    } 

    public override string ApplicationName 
    { 
     get; 
     set; 
    } 

    public override void CreateRole(string roleName) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) 
    { 
     throw new NotImplementedException(); 
    } 

    public override string[] FindUsersInRole(string roleName, string usernameToMatch) 
    { 
     throw new NotImplementedException(); 
    } 

    public override string[] GetAllRoles() 
    { 
     throw new NotImplementedException(); 
    } 

    public override string[] GetRolesForUser(string username) 
    { 
     throw new NotImplementedException(); 
    } 

    public override string[] GetUsersInRole(string roleName) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool IsUserInRole(string username, string roleName) 
    { 
     vUser user = db.vUsers.Where(u => u.UserName == username).First(); 
     if (roleName == "User") 
     { 
      if (user.IsAllowedToView == true) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     else if (roleName == "Administrator") 
     { 
      if (user.IsAllowedToSubmit == true) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     else 
     { 
      return false; 
     } 
    } 

    public override bool RoleExists(string roleName) 
    { 
     if (roleName == "User" || roleName == "Administrator") 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

当我使用我的控制器[Authorize]注释,并调用HttpContext.Current.User.Identity.Name返回该我用的ID登录到我的机器。 (AD的一部分)但是,如果我使用[Authorize(Roles =“User”)],它会一再询问我的用户名和密码,并且不接受任何内容。我把断点放在MyRoleProvider类的每一个方法上,但是程序并没有停下来,这让我觉得它甚至不会调用提供者。

+1

看到我的答案[here](http://stackoverflow.com/a/32590333/1139830)。您只需要继承一个类,连接方法以从表中提取适当的数据,然后就可以开始在应用程序中使用这些角色。 – mason

+0

@mason感谢您将我引导至该帖子。我已经实现了角色管理器,并添加到了我的web.config中。我现在的问题是我如何将用户ID传递给角色管理器。我在控制器的顶部有'[Authorize(Roles =“User”)]',但它不允许我查看它。如何将用户名参数传递给public override bool IsUserInRole(string username,string roleName)? – Jail

+0

你不需要。当我们在web.config中注册我们的角色管理器时,就像我在答案中显示的那样,系统意识到了这一点。如果您要查看该“Authorize'属性的源代码,您将看到它代表您正在调用注册角色管理器(如果您想验证,请在角色管理器中设置断点)。因此,您无需手动获取用户名并将其传递给角色管理员。但是,如果你确实需要用户名,出于其他原因,这来自'HttpContext.Current.User.Identity.Name'。 – mason

回答

0

通过每个控制器或甚至控制器内的每个方法,您可以添加自己的自定义授权角色。

[Authorize(Roles="Admin,Doctor")] 
    public class Investigation : Controller 
    { 

    } 

注: 中的角色必须写它插入到数据库中以同样的方式(案例灵敏)

0

如果您希望管理Active Directory中的角色,你总是可以创建Active Directory用户然后在控制器上使用[Authorize(Roles="{AD_GROUP_NAME}")]注释。

+0

这要求您成为域管理员,或者与域管理员进行合作。虽然它适用于某些情况,但它绝对不适用于所有情况,特别是不适用于这种情况,因为他已经拥有一个包含该信息的数据库。 – mason

+0

同意。只是提供一个可能的选择。 –

0

在您的特定情况下(基于聊天),这听起来像基于角色的概念不适合您,因为您的权限存储在用户级别而不是角色级别,并且您不允许更改由于公司的限制,这是如何工作的。

相反,您应该write your own filter,您可以将其应用于您的操作方法。该过滤器应该可能实施IAuthorizationFilter。这将允许你这样做:

[RequirePermissions("Save")] 
public ActionResult Save(Data date) 
{ 
    Database.Save(data); 
    return View("Success"); 
} 

和验证用户有权限应该抽象出一个共同的类,这样你也可以重用的观点逻辑可能的逻辑。

0
 public override string[] GetRolesForUser(string username) 
     { 
      var userrole = from role in db.roles 
          where username == role.userID 
          select role.role1; 
      if (userrole != null) 
       return userrole.ToArray(); 
      else 
       return new string[] { }; 
      //throw new NotImplementedException(); 
     } 

这个功能应该被编辑。

+0

您能详细解释一下您提供的解决方案吗? – abarisone

+0

我在MyRoleProvider.cs中编辑这个函数,然后它可以工作!当它运行时,我不需要输入我的用户名和密码:) – user6218863

相关问题