是否有任何 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()
我正在使用 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()