基于权限的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

上一篇: Permission Based Authorization with ASP.Net Identity 2

下一篇: Restricting access to Register User in Asp.net MVC