Adding custom claim not working in asp.net core identity

后端 未结 1 905
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-07 01:19

I have created CustomClaimType to store user id:

public static class CustomClaimTypes
{
    public const string UserId = \"UserId\         


        
相关标签:
1条回答
  • 2021-01-07 01:47

    For adding extra claims to Identity, you could implement custom 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. Register 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();
      }
      
    0 讨论(0)
提交回复
热议问题