在我们的公司网络中,没有为我的应用程序适当地分配 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>
现在,您可以通过设置 Authorize 属性保护具有指定角色的特定用户组的控制器、操作、页面:
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();
}
}
}