在我们公司的网络,在Active Directory(AD)的角色不是适当地分配给我的应用程序。 所以,我在数据库映射创建一个简单的表在公元及其角色的所有用户。 从字面上有在此表中,用户和角色只有两列。
我希望利用强大的角色管理的asp.net,我想用那样的功能[Authorize(Roles = "Managers")]
有没有使用这些自定义角色,没有设置复杂的角色和成员提供一个简单的方法?
应用背景:SQL服务器,LINQ,asp.net的MVC
在我们公司的网络,在Active Directory(AD)的角色不是适当地分配给我的应用程序。 所以,我在数据库映射创建一个简单的表在公元及其角色的所有用户。 从字面上有在此表中,用户和角色只有两列。
我希望利用强大的角色管理的asp.net,我想用那样的功能[Authorize(Roles = "Managers")]
有没有使用这些自定义角色,没有设置复杂的角色和成员提供一个简单的方法?
应用背景:SQL服务器,LINQ,asp.net的MVC
这是很容易实现自定义角色提供程序。 基本上你将需要实现两个功能。
看文章: 自定义角色提供了MVC
事件中提供的文章的网站出现故障。
自定义角色提供了MVC
在前面的文章中,我将解释如何创建自定义成员提供程序对用户进行授权和保护控制和网页。 但是,如果你要显示或保护一些区域,控制器或页面为用户的特定组是什么? 例如,只允许管理员访问管理面板。
在用于此目的的.NET框架是角色提供。 但同样,它使用存储用户角色自己的数据库。 因此,让我们创建和配置将使用我们的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[] {}; ;
}
}
正如你可以看到我通过功能的用户名参数定位用户在我的DB(在我的情况下,它可以是用户名或电子邮件),并创建用户角色的字符串列表。
第二个功能是在角色(或组)检查,如果用户:
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();
}
}
}