4

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

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

4

1 回答 1

3

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

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

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

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在登录用户时将其存储在索赔中。has方法
的默认实现。您可以将其修改如下:ApplicationUserGenerateUserIdentityAsync

    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;
    }

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

    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()

于 2015-07-24T16:17:05.517 回答