我正在開發一個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始終為空。我還嘗試通過在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);
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow