Asp.net mvc 5 扩展Identity 2.1以将用户分配给公司,并将角色分配给用户

Asp.net mvc 5 扩展Identity 2.1以将用户分配给公司,并将角色分配给用户,asp.net-mvc-5,asp.net-identity-2,asp.net-mvc-5.2,Asp.net Mvc 5,Asp.net Identity 2,Asp.net Mvc 5.2,好吧,我现在真的迷路了 我有一个运行良好的应用程序,我有可供公司订阅使用的数据组,当用户登录时,他们可以访问其角色允许的数据中的信息,如果他们有多个角色,他们可以访问多个报告区域,如果他们只订阅一个角色,他们只能访问该区域。现在所有的数据都是相同的,每天都会更新,所以如果100个用户订阅了角色1、3和5,他们就可以访问这些数据。在过去的十年中,这些公司的用户将使用一个登录名来访问数据(一个登录名为George提供给公司,但Lisa、john、Jerry和bob都使用George的凭据来下载报告)

好吧,我现在真的迷路了

我有一个运行良好的应用程序,我有可供公司订阅使用的数据组,当用户登录时,他们可以访问其角色允许的数据中的信息,如果他们有多个角色,他们可以访问多个报告区域,如果他们只订阅一个角色,他们只能访问该区域。现在所有的数据都是相同的,每天都会更新,所以如果100个用户订阅了角色1、3和5,他们就可以访问这些数据。在过去的十年中,这些公司的用户将使用一个登录名来访问数据(一个登录名为George提供给公司,但Lisa、john、Jerry和bob都使用George的凭据来下载报告)。请注意,数据不会因公司而异,网站也不会因公司而异。所有数据和主题都是他们可以访问的网站的一部分

现在是问题

我的许多用户(访问我的数据的公司)都要求我,他们希望能够将用户添加到他们的帐户中,这样他们就可以在我按500、1000和2000份报告收费时监控谁正在下载什么报告。我的应用程序记录下载的报告,用户可以从其用户门户和下载报告的id查看这些报告。问题是,这些公司希望能够管理自己的用户,有点像帐户管理员。我已经研究过多租户,但这并不真正适合我的需要,但从我所看到的来看,我觉得我需要向用户和公司id用户角色添加一个公司id,这样每个公司都可以有一个管理角色和一个用户角色。但我不确定,因为我研究和阅读更多关于这一点,我看到分配不同的想法。但我真的看不到一个适合我的

这里有一个例子

每个用户(公司)都有许多用户,该公司中的每个用户都有管理员或用户角色。用户(公司)可以访问角色允许他们访问的许多区域,该公司的用户可以访问公司角色提供的报告。(或查看它们所属的所有组的聚合数据)

考虑将其添加到IdentityModels:

    public class ApplicationUserRole : IdentityUserRole<string>
{
    public string CompanyId { get; set; }
}


public class ApplicationUser : IdentityUser<string, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>//, IAppUser
{
    public ApplicationUser()
    {
        this.Id = Guid.NewGuid().ToString();
    }
    public virtual string CompanyId { get; set; }
    public virtual List<CompanyEntity> Company { get; set; }
    public DateTime CreatedOn { get; set; }

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(ApplicationUserManager manager, string authenticationType)
    {
        var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
        return userIdentity;
    }
}
公共类ApplicationUserRole:IdentityUserRole
{
公共字符串CompanyId{get;set;}
}
公共类应用程序用户:IdentityUser/,IAppUser
{
公共应用程序用户()
{
this.Id=Guid.NewGuid().ToString();
}
公共虚拟字符串CompanyId{get;set;}
公共虚拟列表公司{get;set;}
public DateTime CreatedOn{get;set;}
公共异步任务GenerateUserIdentityAsync(ApplicationUserManager管理器,字符串身份验证类型)
{
var userIdentity=wait manager.CreateIdentityAsync(这是authenticationType);
返回用户身份;
}
}
添加到IdentityConfig:

public string GetCurrentCompanyId(string userName)
    {
        var user = this.FindByName(userName);
        if (user == null)
            return string.Empty;

        var currentCompany = string.Empty;
        if (user.Claims.Count > 0)
        {
            currentCompany = user.Claims.Where(c => c.ClaimType == ConcordyaPayee.Core.Common.ConcordyaClaimTypes.CurrentCompanyId).FirstOrDefault().ClaimValue;
        }
        else
        {
            currentCompany = user.CurrentCompanyId;
        }
        return currentCompany;
    }

    public override Task<IdentityResult> AddToRoleAsync(string userId, string role, string companyId)
    {
        return base.AddToRoleAsync(userId, role);
    }
公共字符串GetCurrentCompanyId(字符串用户名)
{
var user=this.FindByName(用户名);
if(user==null)
返回字符串。空;
var currentCompany=string.Empty;
如果(user.Claims.Count>0)
{
currentCompany=user.Claims.Where(c=>c.ClaimType==concordyapyee.Core.Common.concordyClaimTypes.CurrentCompanyId).FirstOrDefault().ClaimValue;
}
其他的
{
currentCompany=user.CurrentCompanyId;
}
返回公司;
}
公共覆盖任务AddToRoleAsync(字符串用户ID、字符串角色、字符串公司ID)
{
返回base.AddToRoleAsync(userId,role);
}
现在我不确定,我是否需要创建一个新的用户商店。身份验证将如何工作,我是否需要编写一个新的Authorize属性。我应该使用索赔吗。或者ACL系统。或者我需要找一个不同的身份提供者

任何帮助都将不胜感激。因为我很困惑