添加自定义声明在 ASP.NET Core Identity 中不起作用

2023-12-02

我创造了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(空)结果。


要向身份添加额外的声明,您可以实现自定义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. Useage

    public IActionResult About()
    {
        var claims = User.Claims;
        var userId = User.GetUserId();
        var userName = User.GetName();
        ViewData["Message"] = "Your application description page.";
    
        return View();
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

添加自定义声明在 ASP.NET Core Identity 中不起作用 的相关文章

随机推荐