基于ASP.Net身份的基于许可的授权2

时间:2015-08-13 09:08:42

标签: asp.net-mvc asp.net-mvc-5 asp.net-identity claims-based-identity asp.net-identity-2

我正在使用ASP.Net MVC 5应用程序并使用ASP.Net identity 2,并且需要根据角色和权限授权用户。角色和权限彼此无关。例如,访问" action1"动作方法,(" admin"角色)或(#34; role1"和#34; permission1"的组合)必须存在,但其他用户不在&# 34;管理" (" role1"和#34; permission1")的角色或组合对他们来说不是真的,不允许访问该动作方法。

我怎么能做到这种情况?

基于声明的授权是否以这种方式有用? 或者我必须实现Permission实体和自定义AuthorizeAttribute?如果是真的如何?

最好的问候

3 个答案:

答案 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