是否有任何 ASP.NET 身份的实现在帐户之上有另一个级别?

Are there any implementations of ASP.NET Identitity that have another level above account?

我正在使用 ASP.NET 身份。它运行良好,但我想在 AspNetUsers table 中添加父级。就我而言,我想让每个用户都属于一个组织。在这一点上,我只是在寻找一些想法,看看其他人是否已经看到允许这样做的实现。

有没有人见过这样做的任何实现。我想获得一些关于如何实现此功能的提示。

我假设您使用的是身份存储的默认 EF 实现。

标识非常灵活,可以弯曲成多种形状以满足您的需要。

如果您正在寻找一种简单的父子关系,其中每个用户都有一个父记录(例如公司),实现方法之一是将公司引用添加到用户 class :

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.AspNet.Identity.EntityFramework;


public class ApplicationUser : IdentityUser
{
    public ApplicationUser()
    {
    }

    [ForeignKey("CompanyId")]
    public Company Company { get; set; }
    public int CompanyId { get; set; }
}


public class Company
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CompanyId { get; set; }
    public String Name { get; set; }

    public virtual ICollection<ApplicationUser> Users { get; set; }
}

这会将外键放在公司的用户上。但是接下来的操作取决于您的应用程序的要求。我想你会根据用户所属的公司对用户进行某种限制。为了快速检索公司,您可以在登录用户时将 CompanyId 存储在声明中。
ApplicationUser 的默认实现有 GenerateUserIdentityAsync 方法。您可以按如下方式修改:

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        identity.AddClaim(new Claim("CompanyId", CompanyId.ToString()));
        return userIdentity;
    }

然后在每次请求时,您都可以从 cookie 中访问此 CompanyId 声明:

    public static int GetCompanyId(this IPrincipal principal)
    {
        var claimsPrincipal = principal as ClaimsPrincipal;
        //TODO check if claims principal is not null

        var companyIdString = claimsPrincipal.Claims.FirstOrDefault(c => c.Type == "CompanyId");
        //TODO check if the string is not null

        var companyId = int.Parse(companyIdString); //TODO this possibly can explode. Do some validation
        return companyId;
    }

然后您将能够从 Web 应用程序的几乎任何位置调用此扩展方法:HttpContext.Current.User.GetCompanyId()