【问题标题】:Permission Based Authorization with ASP.Net Identity 2使用 ASP.Net Identity 2 的基于权限的授权
【发布时间】:2015-11-06 04:04:20
【问题描述】:
我正在开发一个 ASP.Net MVC 5 应用程序并使用 ASP.Net 身份 2,并且需要根据角色和权限授权用户。角色和权限彼此不相关。例如,要访问“action1”操作方法,(“admin”角色)或(“role1”和“permission1”的组合)必须存在,但其他用户不是“admin”角色或(“ role1" 和 "permission1") 不适合他们,不允许访问该操作方法。
我怎样才能做到这一点?
基于声明的授权以这种方式有用吗?
或者我必须实现 Permission 实体和自定义 AuthorizeAttribute?如果是真的怎么办?
最好的问候
【问题讨论】:
标签:
asp.net-mvc
asp.net-mvc-5
asp.net-identity
claims-based-identity
asp.net-identity-2
【解决方案2】:
这是定制的 Authorize,它检查数据库的权限。
例如,您有 3 个用于权限帐户、客户、配置的布尔值
并且您想根据它们来限制用户。
您甚至可以在一个操作上添加两个权限,例如,您有一个方法可以通过 Account 和 Client 权限访问,而不是您可以添加以下行
修改此以使用具有此权限的角色,这是处理它的最简单和最好的方法。
[PermissionBasedAuthorize("Client, Account")]
下面这个方法是检查数据库中的布尔值。
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);
}
}
}
【解决方案3】:
我为 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。