在寻找能够通过管理控制器为发出请求的用户之外的用户分配和撤销角色的方法时,我实现了一个自定义IAuthorizeFilter,用于检查存储为Claim的Guid标记是否与UserClaims的实体框架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)。
这是一个功能,如果是,可以关闭它还是我在某个地方犯了错误?
答案 0 :(得分:0)
问题是由于有两种不同的方式通过依赖注入创建服务引起的: 我的问题中的示例代码使用
var dbContext = context.HttpContext.ApplicationServices.GetRequiredService<ApplicationDbContext>();
应该使用
var dbContext = context.HttpContext.RequestServices.GetRequiredService<ApplicationDbContext>();
此处的差异在ApplicationServices
和RequestServices
之间。看起来ApplicationServices
注入器确实有一个数据库上下文的实例,它在前面填充了DbSet,因此返回缓存数据而不是进行数据库查询。