添加自定义要求在asp.net核心身份不工作

问题描述 投票:0回答:1

我创建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(零)的结果。

c# asp.net-core asp.net-core-mvc asp.net-identity
1个回答
1
投票

为了增加额外的身份索赔,你可以实现自定义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. 用法 qazxsw POI
© www.soinside.com 2019 - 2024. All rights reserved.