我正在使用ASP.Net MVC 5应用程序并使用ASP.Net identity 2,并且需要根据角色和权限授权用户。角色和权限彼此无关。例如,访问" action1"动作方法,(" admin"角色)或(#34; role1"和#34; permission1"的组合)必须存在,但其他用户不在&# 34;管理" (" role1"和#34; permission1")的角色或组合对他们来说不是真的,不允许访问该动作方法。
我怎么能做到这种情况?
基于声明的授权是否以这种方式有用? 或者我必须实现Permission实体和自定义AuthorizeAttribute?如果是真的如何?
最好的问候
答案 0 :(得分:2)
查看Thinktecture.IdentityModel.Owin.ResourceAuthorization.Mvc
包中的ResourceAuthorize
属性。
该属性基于动作(例如,读取)和资源(例如,联系人详细信息)来授权用户。然后,您可以根据声明(例如,他们在角色中的存在)来确定是否允许他们对资源执行该操作。
请参阅here以获得一个好例子。
可能不是您正在寻找的,但您可以使用类似的逻辑来获取灵感并实现您自己的授权属性。
答案 1 :(得分:1)
这是自定义的Authorize,它检查来自数据库的权限。 例如,您有3个bool用于权限帐户,客户端,配置 并且您希望基于它们限制用户。
您甚至可以在一个操作上添加两个权限,例如,您有一个方法可以通过帐户和客户端权限访问,而不是您可以添加以下行
修改此选项以使用具有权限的角色,这是处理它的最简单和最好的方法。
[PermissionBasedAuthorize("Client, Account")]
下面的方法是检查数据库中的bools。
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);
}
}
}
答案 2 :(得分:1)
我为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>());
}
}
此外,它还是一个开源和免费扩展程序,您可以访问存储库here。