获取给定声明的所有用户

本文关键字:用户 声明 获取 | 更新日期: 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)
                     };