获取具有特定声明的所有用户

时间:2016-11-15 01:11:40

标签: asp.net-core asp.net-identity entity-framework-core claims-based-identity

我正在开发一个aspnet核心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始终为空。我还试图通过在ToList()之后添加Include()来实现查询,但没有成功。

当我意识到这不起作用时,我预计会有某种ClaimsManager<T>进行这种操作。

我发现的所有apis和answers都专注于为单个用户提出索赔。

我知道我可以做类似于this answer的事情,但我宁愿不这样做,我希望该查询能够在数据库中运行。

我想可以创建一个存储过程,但我宁愿在我的应用程序中保留我的域逻辑。

版本:

(我认为这是相关的)

{
    "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"
}

1 个答案:

答案 0 :(得分:3)

我相信你在UserManager中寻找this方法:

/// <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);
}