如何使用集成Windows身份验证的角色

时间:2015-10-01 13:08:25

标签: asp.net asp.net-mvc asp.net-mvc-5 asp.net-web-api2 windows-integrated-auth

我正在使用Web API 2在ASP.NET MVC 5中实现的Web应用程序。

我通过将以下代码添加到web.config来实现集成Windows身份验证:

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

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

现在,我要求根据用户的角色访问某些功能。我有一个表格,我拥有用户权限,但我不知道如何创建这些角色,并将正确的权限与它们相关联。

任何帮助都将不胜感激。

提前致谢

[UPDATE]

根据梅森的回答,我稍微更新了代码。

在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的一部分)但是,如果我使用[授权(角色=&#34;用户&#34;)],它会一次又一次地询问我的用户名和密码,并且不接受任何内容。我把断点放在MyRoleProvider类的每一个方法上,但程序没有停在任何让我觉得可能它甚至没有调用提供者的程序。

4 个答案:

答案 0 :(得分:0)

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

Array()

注意: 角色必须以与插入数据库相同的方式编写。(案例敏感)

答案 1 :(得分:0)

如果您希望从Active Directory管理角色,您可以随时为每个特定角色创建Active Directory用户组,然后在控制器顶部使用[Authorize(Roles="{AD_GROUP_NAME}")]注释。

答案 2 :(得分:0)

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

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

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

可能验证用户的逻辑是否应将该权限抽象为公共类,以便您也可以在视图中重用逻辑。

答案 3 :(得分: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();
        }

应编辑此功能。