基于权限的ASP.Net身份验证2
我正在研究ASP.Net MVC 5应用程序并使用ASP.Net标识2,并且需要根据角色和权限授权用户。 角色和权限彼此无关。 例如,访问“action1”操作方法,(“admin”角色)或(“role1”和“permission1”的组合)必须存在,但其他用户不具有“admin”角色或(“ role1“和”permission1“)对他们来说不是真实的,不允许访问那个动作方法。
我怎么能做这个场景?
以这种方式进行基于授权的授权有用吗? 或者我必须实现Permission实体和自定义AuthorizeAttribute? 如果真的如何?
最好的祝福
检查Thinktecture.IdentityModel.Owin.ResourceAuthorization.Mvc
包中的ResourceAuthorize
属性。
该属性基于动作(例如读取)和资源(例如联系人详细信息)授权用户。 然后,您可以根据他们是否被允许在基于声明的资源上执行该操作(例如他们在角色中的存在)。
在这里看到一个很好的例子。
可能不是你正在寻找的东西,但你可以采取灵感并使用类似的逻辑实现你自己的授权属性。
这是自定义的从数据库检查权限的Authorize。 例如,您有3个布尔权限帐户,客户端,配置,并且您想根据他们限制用户。
您甚至可以在一个操作中添加两个权限,例如,您可以通过帐户和客户端权限访问的方法比您可以添加以下行
将其修改为使用具有此权限的角色,这是处理它的最简单和最好的方法。
[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);
}
}
}
我为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>());
}
}
它也是一个开源和免费的扩展,你可以在这里访问仓库。
链接地址: http://www.djcxy.com/p/90181.html