代码之家  ›  专栏  ›  技术社区  ›  Tom Troughton

如何在ASP.NET核心标识中使用角色GUID而不是名称?

  •  0
  • Tom Troughton  · 技术社区  · 6 年前

    Id 还有一根绳子 Name ,它是各种内置服务传递的名称。

    例如,当我打电话时 _userManager.GetRolesAsync(user) 我得到一个字符串名列表。如果我要身份证怎么办?没有用于此的API,因此我必须使用角色管理器来获取所有角色并映射它们。默认情况下,角色名称不受唯一键的约束,因此这是不可靠的。

    我一定错过了什么,但是什么?我现在的用例是,我想用用户的角色填充JWT声明。就我而言,角色名是我的应用程序内部的,我不想将它们暴露给客户端。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Edward    6 年前

    对于 _userManager.GetRolesAsync(user) ,它叫 userRoleStore.GetRolesAsync

            public virtual async Task<IList<string>> GetRolesAsync(TUser user)
        {
            ThrowIfDisposed();
            var userRoleStore = GetUserRoleStore();
            if (user == null)
            {
                throw new ArgumentNullException(nameof(user));
            }
            return await userRoleStore.GetRolesAsync(user, CancellationToken);
        }
    

    userRoleStore.GetRolesAsync UserStore .

    •            public class CustomUserStore : UserStore<IdentityUser>
      {
          public CustomUserStore(DbContext context, IdentityErrorDescriber describer = null) : base(context, describer)
          {
          }
      
          public override async Task<IList<string>> GetRolesAsync(IdentityUser user, CancellationToken cancellationToken = default(CancellationToken))
          {
              var roleNames = await base.GetRolesAsync(user, cancellationToken);
              var roleIds = await Context.Set<IdentityRole>()
                                   .Where(r => roleNames.Contains(r.Name))
                                   .Select(r => r.Id)
                                   .ToListAsync();
      
              return roleIds;
          }
      }
      
    •     services.AddDefaultIdentity<IdentityUser>()
              .AddRoles<IdentityRole>()
              .AddUserStore<CustomUserStore>()
              .AddEntityFrameworkStores<ApplicationDbContext>()
              ;
          services.AddScoped<DbContext, ApplicationDbContext>();
      
    • 然后,您将通过获取角色id集合

          var user = await _userManager.FindByNameAsync(User.Identity.Name);
          var roles = await _userManager.GetRolesAsync(user);