【问题标题】: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


    【解决方案1】:

    查看Thinktecture.IdentityModel.Owin.ResourceAuthorization.Mvc 包中的ResourceAuthorize 属性。

    此属性根据操作(例如阅读)和资源(例如联系方式)授权用户。然后,您可以根据声明(例如,他们在角色中的存在)确定是否允许他们对资源执行该操作。

    请参阅here 了解一个很好的例子。

    可能不是您正在寻找的,但您可以获取灵感并使用类似的逻辑实现您自己的授权属性。

    【讨论】:

    • 链接失效
    【解决方案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

      【讨论】:

        猜你喜欢
        • 2012-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-18
        • 2015-01-18
        • 2021-09-14
        相关资源
        最近更新 更多