获取给定声明的所有用户
本文关键字:用户 声明 获取 | 更新日期: 2023-09-27 18:17:50
我正在做一个asp.net core 1.0项目,我最近才明白什么是声明,以及如何使用声明来实现基于策略的授权。
我想要达到的目标:
我想获得所有使用给定策略授权的用户(即具有给定声明的用户,假设为Claim {Type = "CanReceiveXReport", Value = True}
)
public static IQueryable<User> WithClaim(this IQueryable<User> users, string claimName) =>
users
.Include(u=> u.Claims)
.Where(u=> u.Claims.Any(c=> c.ClaimType == claimName));
问题:
当我运行上面的代码时,对于所有用户,user.Claims
总是空的。我还试图通过在Include()
之后添加ToList()
来实现查询,但没有成功。
当我意识到这不起作用时,我期望有某种ClaimsManager<T>
来完成这种操作。
我找到的所有api和答案都集中在获取单个用户的索赔上。
我知道我可以做一些类似于这个答案的事情,但我宁愿不这样做,我希望查询在数据库中运行。
我想创建一个存储过程是可能的,但我宁愿在我的应用程序中维护我的域逻辑。
版本:
我认为是相关的
{
"Microsoft.AspNetCore.Identity": "1.0.0",
"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0",
"Microsoft.EntityFrameworkCore.Relational": "1.0.0",
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.1",
"Microsoft.NETCore.App": "1.0.0"
}
我相信你正在UserManager中寻找这个方法:
/// <summary>
/// Returns a list of users from the user store who have the specified <paramref name="claim"/>.
/// </summary>
/// <param name="claim">The claim to look for.</param>
/// <returns>
/// A <see cref="Task{TResult}"/> that represents the result of the asynchronous query, a list of <typeparamref name="TUser"/>s who
/// have the specified claim.
/// </returns>
public virtual Task<IList<TUser>> GetUsersForClaimAsync(Claim claim)
{
ThrowIfDisposed();
var store = GetClaimStore();
if (claim == null)
{
throw new ArgumentNullException(nameof(claim));
}
return store.GetUsersForClaimAsync(claim, CancellationToken);
}
我使用一个自定义查询来为角色提取具有特定声明类型的用户。我在这里硬编码了索赔类型,但如果您传入一个变量,这可能适用于您的情况。
var usersWithRoles = from u in _context.Users
join r in _context.UserClaims.Where(x => x.ClaimType == "RoleId") on u.Id equals r.UserId into ur
from defaultRole in ur.DefaultIfEmpty()
select new UserBaseModel() {
Id = u.Id,
FirstName = u.FirstName,
LastName = u.LastName,
Email = u.Email,
RoleId = defaultRole.ClaimValue == null ? 0 : Convert.ToInt32(defaultRole.ClaimValue)
};