我正在开发一个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"
}
答案 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);
}