Asp.Net 5 /身份3:在IdentityDbContext實現中緩存聲明

asp.net asp.net-core asp.net-identity-3 c# entity-framework-core

在尋找能夠通過管理控制器為發出請求的用戶之外的用戶分配和撤銷角色的方法時,我實現了一個自定義IAuthorizeFilter,用於檢查存儲為Claim的Guid標記是否與值中的值匹配UserClaims的實體框架7代碼優先身份表。

Essentials,這是代碼:

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的行中遇到問題,它可以通過以下方式更具可讀性:

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

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

這是一個功能,如果是,可以關閉它或我在某處犯了錯誤?

一般承認的答案

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

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

它應該使用的地方

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

這裡的區別在於ApplicationServicesRequestServices 。看起來ApplicationServices注入器確實有一個數據庫上下文的實例,它已經在之前填充了DbSet,因此返回緩存數據而不是進行數據庫查詢。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因