我正在使用 ASP.NET 标识。它运行良好,但我想将父级添加到 AspNetUsers 表中。就我而言,我希望每个用户都属于一个组织。在这一点上,我只是在寻找一些想法,看看其他人是否已经看到了允许这样做的实现。
有没有人见过这样做的任何实现。我想获得一些关于如何实现此功能的提示。
我正在使用 ASP.NET 标识。它运行良好,但我想将父级添加到 AspNetUsers 表中。就我而言,我希望每个用户都属于一个组织。在这一点上,我只是在寻找一些想法,看看其他人是否已经看到了允许这样做的实现。
有没有人见过这样做的任何实现。我想获得一些关于如何实现此功能的提示。
我假设您正在使用身份存储的默认 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方法
的默认实现。您可以将其修改如下: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;
}
然后在每个请求上,您都可以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()