在我们的公司网络中,Active Directory(AD)中的角色未正确分配给我的应用程序。所以我在我的数据库中创建了一个简单的表,映射了AD中的所有用户及其角色。这个表中只有两列,即用户和角色。
我希望利用asp.net中强大的角色管理功能,我想使用像[Authorize(Roles = "Managers")]
这样的功能。是否有一种简单的方法来使用这些自定义角色而无需设置复杂的角色和成员资格提供程
申请背景: sql server,linq,asp.net mvc
答案 0 :(得分:12)
实现自定义角色提供程序非常容易。基本上你需要实现两个功能。
答案 1 :(得分:5)
Article provided in the event the website goes down.
MVC的自定义角色提供程序
在上一篇文章中,我将解释如何创建自定义成员资格提供程序以授权用户并保护控件和页面。但是,如果您想为特定用户群显示或保护某些区域,控制器或页面,该怎么办?例如,仅允许管理员访问管理员面板。
在.Net Framework中,为此目的是角色提供者。但同样,它使用自己的DB来存储用户角色。因此,让我们创建和配置将使用我们的数据库或任何其他存储的自定义角色提供程序。和以前一样,我们应该从.NET中覆盖类:
对于最小功能,我们需要实现并覆盖两个函数GetRolesForUser和IsUserInRole。首先,一个用于获取所有用户角色(或组)的列表:
public override string[] GetRolesForUser(string username)
{
using (DatabaseEntities db = new DatabaseEntities())
{
User user = db.Users.FirstOrDefault(u => u.UserName.Equals(username, StringComparison.CurrentCultureIgnoreCase) || u.Email.Equals(username, StringComparison.CurrentCultureIgnoreCase));
var roles = from ur in user.UserRoles
from r in db.Roles
where ur.RoleId == r.Id
select r.Name;
if (roles != null)
return roles.ToArray();
else
return new string[] {}; ;
}
}
正如您所看到的,我通过函数的用户名参数在我的数据库中找到用户(在我的情况下,它可以是用户名或电子邮件)并创建用户角色的字符串列表。
第二个功能是检查角色(或组)中的用户是否为:
public override bool IsUserInRole(string username, string roleName)
{
using (DatabaseEntities db = new DatabaseEntities())
{
User user = db.Users.FirstOrDefault(u => u.UserName.Equals(username, StringComparison.CurrentCultureIgnoreCase) || u.Email.Equals(username, StringComparison.CurrentCultureIgnoreCase));
var roles = from ur in user.UserRoles
from r in db.Roles
where ur.RoleId == r.Id
select r.Name;
if (user != null)
return roles.Any(r => r.Equals(roleName, StringComparison.CurrentCultureIgnoreCase));
else
return false;
}
}
然后我们需要在web.config文件解决方案中配置使用创建的角色提供程序。可能需要将cacheRolesInCookie
设置为false以进行调试,否则行为将无法预测。
<system.web>
<compilation debug="true" targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2" />
<authentication mode="Windows" />
<authorization>
<deny users="?" />
</authorization>
<roleManager cacheRolesInCookie="true" defaultProvider="KitsulaRoleProvider" enabled="true">
<providers>
<clear />
<add name="KitsulaRoleProvider" type="Kitsula.Security.KitsulaRoleProvider" />
</providers>
</roleManager>
</system.web>
现在,您可以通过设置授权属性来保护处于指定角色的特定用户组的控制器,操作和页面:
using System;
using System.Web.Mvc;
namespace Kitsula.Areas.Admin.Controllers
{
[Authorize(Roles = "Administrators")]
public class HomeController : Controller
{
//
// GET: /Admin/Home/
public ActionResult Index()
{
return View();
}
}
}