在我们公司的网络中,Active Directory(AD)中的角色分配不适用于我的应用程序。所以我在我的数据库中创建了一个简单的表格,将AD中所有用户及其角色进行了映射。这个表格只有两列,用户和角色。
我希望能够利用 asp.net 中强大的角色管理功能,例如使用[Authorize(Roles = "Managers")]
等特性。有没有一种简单的方法可以使用自定义角色而不设置复杂的角色和成员提供程序?
应用程序背景: sql server, linq, asp.net mvc
在我们公司的网络中,Active Directory(AD)中的角色分配不适用于我的应用程序。所以我在我的数据库中创建了一个简单的表格,将AD中所有用户及其角色进行了映射。这个表格只有两列,用户和角色。
我希望能够利用 asp.net 中强大的角色管理功能,例如使用[Authorize(Roles = "Managers")]
等特性。有没有一种简单的方法可以使用自定义角色而不设置复杂的角色和成员提供程序?
应用程序背景: sql server, linq, asp.net mvc
实现自定义角色提供程序非常容易。基本上你需要实现两个函数。
请看这篇文章:MVC的自定义角色提供程序
MVC自定义角色提供程序
在之前的一篇文章中,我解释了如何创建自定义成员资格提供程序来授权用户并保护控件和页面。但是,如果您想要显示或保护某个区域、控制器或页面,以供特定组的用户使用怎么办?例如,仅允许管理员访问管理面板。
在 .Net Framework 中,为此目的使用角色提供程序。但是,它再次使用自己的数据库存储用户角色。因此,让我们创建和配置自定义角色提供程序,它将使用我们的数据库或任何其他存储。与之前一样,我们应该覆盖 .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();
}
}
}