基于权限的ASP授权.2.网络身份



我正在做一个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>());
    }
}

它也是一个开源的免费扩展,你可以在这里访问存储库

相关内容

  • 没有找到相关文章

最新更新