添加自定义声明不适用于asp.net核心身份

时间:2019-02-05 10:50:12

标签: c# asp.net-core asp.net-core-mvc asp.net-identity

我已创建CustomClaimType来存储user id

public static class CustomClaimTypes
{
    public const string UserId = "UserId";
}

当用户登录时,我对其进行设置:

var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, doc_session.ufname + " " + doc_session.ulname));
claims.Add(new Claim(CustomClaimTypes.UserId, doc_session.isci_id.Value.ToString()));
ClaimsIdentity userIdentity = new ClaimsIdentity(claims,"Identity.Application");
ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity);

我还创建了自定义身份扩展名:

public static class IdentityExtensions
{
    public static int GetUserId(this IIdentity identity)
    {
        ClaimsIdentity claimsIdentity = identity as ClaimsIdentity;
        Claim claim = claimsIdentity?.FindFirst(CustomClaimTypes.UserId);

        if (claim == null)
            return 0;

        return int.Parse(claim.Value);
    }

    public static string GetName(this IIdentity identity)
    {
        ClaimsIdentity claimsIdentity = identity as ClaimsIdentity;
        Claim claim = claimsIdentity?.FindFirst(ClaimTypes.Name);

        return claim?.Value ?? string.Empty;
    }
}

但是当我致电User.Identity.GetUserId();时,结果为0(空)。

1 个答案:

答案 0 :(得分:1)

要向Identity添加更多声明,您可以实现自定义CustomClaimsPrincipalFactory

  1. CustomClaimsPrincipalFactory

    public class CustomClaimsPrincipalFactory : UserClaimsPrincipalFactory<IdentityUser<int>>
    {
        public CustomClaimsPrincipalFactory(UserManager<IdentityUser<int>> userManager,
                                                IOptions<IdentityOptions> optionsAccessor)
        : base(userManager, optionsAccessor)
        {
        }
    
        public async override Task<ClaimsPrincipal> CreateAsync(IdentityUser<int> user)
        {
            var principal = await base.CreateAsync(user);
    
            // Add your claims here
            ((ClaimsIdentity)principal.Identity).AddClaims(
                new[] { new Claim(ClaimTypes.Name, user.UserName),
                new Claim(CustomClaimTypes.UserId, user.Id.ToString())
                });
    
            return principal;
        }
    }
    
  2. 注册CustomClaimsPrincipalFactory

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });
    
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser<int>>()
            .AddEntityFrameworkStores<ApplicationDbContext>();
        services.AddScoped<IUserClaimsPrincipalFactory<IdentityUser<int>>, CustomClaimsPrincipalFactory>();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }
    
  3. IdentityExtensions

    public static class IdentityExtensions
    {
        public static int GetUserId(this ClaimsPrincipal identity)
        {
            Claim claim = identity?.FindFirst(CustomClaimTypes.UserId);
    
            if (claim == null)
                return 0;
    
            return int.Parse(claim.Value);
        }
    
        public static string GetName(this ClaimsPrincipal identity)
        {
            Claim claim = identity?.FindFirst(ClaimTypes.Name);
    
            return claim?.Value ?? string.Empty;
        }
    }
    
  4. 使用情况

    public IActionResult About()
    {
        var claims = User.Claims;
        var userId = User.GetUserId();
        var userName = User.GetName();
        ViewData["Message"] = "Your application description page.";
    
        return View();
    }