簡體   English   中英

Asp.Net 5 / Identity 3:IdentityDbContext實現中的聲明緩存

[英]Asp.Net 5 / Identity 3: Caching of Claims in the IdentityDbContext implementation

在尋找一種能夠通過管理控制器為除發出請求的用戶以外的用戶分配和撤消角色的方法時,我實現了一個自定義IAuthorizeFilter,用於檢查存儲為Claim的Guid標簽是否與其中的值匹配UserClaims的Entity Framework 7代碼優先標識表。

要點,它是以下代碼:

public class RefreshUserClaimsFilterAttribute : IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext context)
    {
        var User = context.HttpContext.User;
        var dbContext = context.HttpContext.ApplicationServices.GetRequiredService<ApplicationDbContext>();
        var stampFromClaims = User.Claims.FirstOrDefault(Claim => Claim.Type == "ClaimsStamp")?.Value;
        var stampFromDb = dbContext.UserClaims.Where(UserClaim => UserClaim.UserId == User.GetUserId()).ToList().FirstOrDefault(UserClaim => UserClaim.ClaimType == "ClaimsStamp")?.ClaimValue; 
        // Update claims via RefreshSignIn if necessary
    }
}

我在分配var stampFromDb的行遇到問題,它可以通過以下方式更易讀:

var stampFromDb = dbContext.UserClaims.FirstOrDefault(UserClaim => UserClaim.UserId == User.GetUserId() && UserClaim.ClaimType == "ClaimsStamp")?.ClaimValue;

但是,這給了我緩存(與User.Identity的實際聲明相同的值)結果,並且我找不到關於此的任何文檔。 我最好的猜測是該錯誤在我身邊,但是我從未遇到過這樣的問題。 這是我第一次使用Asp.Net 5和EF7。 我正在使用與SQL Server 12.0.2000的默認連接(LocalDB)。

這是一項功能嗎?如果可以,可以將其關閉還是我在某個地方犯了錯誤?

該問題是由於通過依賴項注入創建服務的方式有兩種不同而引起的:我問題中使用的示例代碼

var dbContext = context.HttpContext.ApplicationServices.GetRequiredService<ApplicationDbContext>();

應該在哪里使用

var dbContext = context.HttpContext.RequestServices.GetRequiredService<ApplicationDbContext>();

這里的區別是ApplicationServicesRequestServices之間。 看起來ApplicationServices注入ApplicationServices確實在某處具有數據庫上下文的實例,該實例先前已填充了DbSet,因此返回了緩存的數據,而不是執行數據庫查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM