Asp.Net 5 / 身份 3:在 IdentityDbContext 实现中缓存声明

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

在寻找一种能够通过管理员控制器为发出请求的用户以外的用户分配和撤销角色的方法时,我实现了一个自定义的 IAuthorizeFilter 来检查 Guid 标签是否存储为 Claim,与 UserClaims 的 Entity Framework 7 Code First Identity table 中的值相匹配。

要点,就是这个代码:

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 注入器确实在某个地方有一个数据库上下文的实例,该实例在早些时候填充了 DbSet,因此返回缓存数据而不是进行数据库查询。