ASP.NET Core如何获取Identity数据库所有用户的Claim并列表展示
实现方案
你之前用的User.Claims只能获取当前请求登录用户的声明,要拿到全量用户的Claim数据,按以下步骤实现即可:
1. 后端获取所有用户的Claim数据
你已经注入了自定义上下文DBContextClass,直接用上下文查询Identity内置的UserClaims数据集性能最高,适合所有场景:
首先在你的IndexModel中定义接收数据的属性,然后在OnGet方法中查询:
// PageModel中定义传递给视图的属性 public List<IdentityUserClaim<string>> AllUserClaims { get; set; } public async Task OnGetAsync() { // 直接查询AspNetUserClaims表的全量数据 AllUserClaims = await _context.UserClaims.ToListAsync(); // 如果需要关联带出用户名等用户基础信息,改用关联查询即可 /* AllUserClaims = await _context.UserClaims .Join(_context.Users, claim => claim.UserId, user => user.Id, (claim, user) => new { claim.UserId, user.UserName, claim.ClaimType, claim.ClaimValue }).ToListAsync(); */ }
如果你的用户量很小,也可以用UserManager遍历所有用户拉取声明:
AllUserClaims = new List<IdentityUserClaim<string>>(); var allUsers = await _userManager.Users.ToListAsync(); foreach (var user in allUsers) { var claims = await _userManager.GetClaimsAsync(user); AllUserClaims.AddRange(claims.Select(c => new IdentityUserClaim<string> { UserId = user.Id, ClaimType = c.Type, ClaimValue = c.Value })); }
注:如果你的Identity主键不是默认的string类型,把
IdentityUserClaim<string>的泛型参数替换为你实际的主键类型即可。
2. 前端视图渲染Claims列表
参考你现有的表格写法,新增以下表格渲染全量Claim数据:
<table class="table border-light" id="UserClaims"> <thead> <tr> <th>用户ID</th> <!-- 如果关联查询了用户名就打开下面这行 --> <!-- <th>用户名</th> --> <th>声明类型(ClaimType)</th> <th>声明值(ClaimValue)</th> </tr> </thead> <tbody> @foreach (var claim in Model.AllUserClaims) { <tr> <td>@Html.DisplayFor(c => c.UserId)</td> <!-- <td>@Html.DisplayFor(c => c.UserName)</td> --> <td>@Html.DisplayFor(c => c.ClaimType)</td> <td>@Html.DisplayFor(c => c.ClaimValue)</td> </tr> } </tbody> </table>
内容的提问来源于stack exchange,提问作者Ehioze
相关产品推荐
相关产品推荐

