正在寻找实现基本用户角色的简单方法
本文关键字:角色 简单 方法 用户 寻找 实现 | 更新日期: 2023-09-27 17:58:49
我正在使用Windows身份验证构建一个intranet应用程序,并且我已经将我的用户拉到了我的本地数据库,只保留了Active Directory中我需要的信息。
我想为我的用户(管理员或用户)分配角色,并限制管理员视图。
有没有一种简单的方法可以在不走身份路线的情况下做到这一点?我已经调查过了,它似乎有些过头了,老实说相当令人困惑。是否有一种方法可以创建一个可用作注释的实用程序类,并根据当前用户角色属性简单地限制视图?
我为感兴趣的人找到了一个简单的解决方案。我决定完全避免使用任何角色提供程序,因为您真正需要的只是一个验证请求的方法和另一个检查用户角色的方法。在我的Global.asax中,我添加了以下方法,取自这篇博客文章:
void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
var ctx = HttpContext.Current;
if (ctx.Request.IsAuthenticated)
{
string[] roles = LookupRolesForUser(ctx.User.Identity.Name);
var newUser = new GenericPrincipal(ctx.User.Identity, roles);
ctx.User = Thread.CurrentPrincipal = newUser;
}
}
您必须自己实现的唯一方法是LookupRolesForUser。我的表是这样的(Linq将取决于你的数据库结构,我有3个表:User、Role和User_Role):
public string[] LookupRolesForUser(string username)
{
using (MyContext db = new MyContext())
{
var user = db.Users.FirstOrDefault(u => u.Username.Equals(username, StringComparison.CurrentCultureIgnoreCase) || u.Email.Equals(username, StringComparison.CurrentCultureIgnoreCase));
var roles = from ur in user.Roles
from r in db.Roles
where ur.RoleId == r.RoleId
select r.RoleName;
if (roles != null)
return roles.ToArray();
else
return new string[] { }; ;
}
}
然后,您可以在控制器中使用授权公告,如下所示:
[Authorize(Roles = "Administrator")]
public class AdminController : BaseController