我使用的是ASP。净的身份。它工作得很好,但我想添加一个父AspNetUsers表。在我的例子中,我希望每个用户属于一个组织。在这一点上,我只是寻找一些想法,看看其他人是否已经看到了实现,将允许这一点。
有人见过这样做的实现吗?我想获得一些关于如何实现这个功能的提示。
我假设您正在使用默认的EF实现身份存储
Identity是非常灵活的,可以弯曲成各种形状来满足你的需要。
如果您正在寻找一个简单的父子关系,其中每个用户都有一个父记录(例如Company),实现该关系的方法之一是将Company引用添加到用户类:
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
存储在claim中。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()