【问题标题】:Adding custom claim not working in asp.net core identity添加自定义声明在 asp.net 核心身份中不起作用
【发布时间】:2019-06-29 04:09:57
【问题描述】:

我创建了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 (null) 作为结果。

【问题讨论】:

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


    【解决方案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();
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 2018-07-04
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 2019-05-05
      相关资源
      最近更新 更多