【问题标题】:ASP.NET Identity - Filter roles based on companyASP.NET Identity - 根据公司过滤角色
【发布时间】:2015-06-11 13:38:27
【问题描述】:

我有一个 Web 应用程序,其中包含多个公司的数据(例如 Multitenancy),但用户可以访问多个公司(与 Multitenancy 的不同点)。此外,不同公司的用户可能拥有不同的访问权限。

例如: 用户 A 对公司 A 具有管理员访问权限,而对公司 B 只有基本访问权限

为了支持此功能,我已将 Company 添加到 AspNetUserRoles 表中。我想要做的是根据为用户登录选择的公司过滤身份框架返回的角色。

应用程序使用UserManager 类中的FindByNameAsync 方法返回用户对象,但我认为我的关联点在堆栈中更靠后。

实现此功能的最佳方式是什么?最佳结合点在哪里?

任何帮助将不胜感激。

【问题讨论】:

    标签: c# asp.net asp.net-identity multi-tenant


    【解决方案1】:

    您可以通过以下方式实现此功能:

    1. 为一家公司添加多个角色,例如Aspnet_Roles 表中的 CompanyA_Admin、CompanyA_Basic、CompanyB_Admin、CompanyB_Basic
    2. 然后通过 System.Web.Security.Roles.GetRolesForUser() 进一步获取给定用户的所有角色
    3. 为用户获取所有公司:

      string[] CompaniesForUser()
      {
      
      //Change to commented version for production   
      string[] roles = new string[] { "CompanyA_Admin", "CompanyB_Admin", "CompanyA_Basic", "CompanyB_Basic" };  //System.Web.Security.Roles.GetRolesForUser();
      string[] companies = new string[100];
      int index = 0;
      
      foreach(string role in roles)
      {
          string cName =  role.Split('_')[0];
      
          //Only add new companies
          if (!companies.Contains(cName))
          {
              companies[index] = cName;
      
              //Testing
              Response.Write("Index : " + index + " - " + cName + "<br>");
      
              index++;
          }
      }
      
      return companies;
      

      }

    【讨论】:

    • 感谢您的回复。但我的偏好是不要为每个公司设置重复的角色,因为那样我就必须授权代码中的所有重复角色。此外,如果添加了新公司,我将不得不遍历所有代码并更新以包含新公司的角色。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2011-08-21
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    相关资源
    最近更新 更多