我正在做一个ASP。asp.net MVC 5应用程序,并使用ASP。网络身份2,需要根据角色和权限对用户进行授权。角色和权限之间没有关联。例如,要访问"action1"操作方法,他必须存在("admin"角色)或("role1"one_answers"permission1"的组合),但其他非"admin"角色的用户或("role1"one_answers"permission1"的组合)对他们来说不成立,不允许访问该操作方法。
我怎么做这个场景?
基于声明的授权在这种方式下有用吗?或者我必须实现权限实体和自定义AuthorizeAttribute?如果是真的如何?查看Thinktecture.IdentityModel.Owin.ResourceAuthorization.Mvc
包中的ResourceAuthorize
属性
此属性基于操作(例如读取)和资源(例如联系方式)对用户进行授权。然后,您可以根据声明(例如,它们在角色中的存在)确定是否允许它们在资源上执行该操作。
看这里有一个很好的例子
可能不是您想要的,但是您可以从中获得灵感,并使用类似的逻辑实现您自己的授权属性。
这是自定义的授权,从数据库检查权限。例如,您有3个权限工具:帐户、客户端、配置并且你想基于它们来限制用户
您甚至可以在一个操作上添加两个权限,例如,您有一个方法可以由Account和Client权限访问,因此您可以添加以下行
修改this以使用在this中具有权限的角色,这是处理它的最简单和最好的方法。
[PermissionBasedAuthorize("Client, Account")]
下面的方法是从数据库中检查bool。
public class PermissionBasedAuthorize : AuthorizeAttribute
{
private List<string> screen { get; set; }
public PermissionBasedAuthorize(string ScreenNames)
{
if (!string.IsNullOrEmpty(ScreenNames))
screen = ScreenNames.Split(',').ToList();
}
public override void OnAuthorization(HttpActionContext actionContext)
{
base.OnAuthorization(actionContext);
var UserId = HttpContext.Current.User.Identity.GetUserId();
ApplicationContext db = new ApplicationContext();
var Permissions = db.Permissions.Find(UserId);
if (screen == null || screen.Count() == 0)
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
}
bool IsAllowed = false;
foreach (var item in screen)
foreach (var property in Permissions.GetType().GetProperties())
{
if (property.Name.ToLower().Equals(item.ToLower()))
{
bool Value = (bool)property.GetValue(Permissions, null);
if (Value)
{
IsAllowed = true;
}
break;
}
}
if (!IsAllowed)
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
}
}
}
我为Microsoft Identity 2成员系统实现了一个基于权限的扩展。但是在这个扩展中,权限和角色是相关的。它们之间存在多对多关系。此外,您还可以使用角色和权限组合的复杂身份验证。我想它可以帮助你做基于权限的身份验证。
权限认证有两种方式:
第一种方法:
// GET: /Manage/Index
[AuthorizePermission(Name = "Show_Management", Description = "Show the Management Page.")]
public async Task<ActionResult> Index(ManageMessageId? message)
{
//...
}
第二种方法:
// GET: /Manage/Users
public async Task<ActionResult> Users()
{
if (await HttpContext.AuthorizePermission(name: "AllUsers_Management", description: "Edit all of the users information."))
{
return View(db.GetAllUsers());
}
else if (await HttpContext.AuthorizePermission(name: "UnConfirmedUsers_Management", description: "Edit unconfirmed users information."))
{
return View(db.GetUnConfirmedUsers());
}
else
{
return View(new List<User>());
}
}
它也是一个开源的免费扩展,你可以在这里访问存储库