有ASP的实现吗?具有比帐户更高级别的.NET标识



我使用的是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()

相关内容

  • 没有找到相关文章

最新更新