Asp.Net 5 / Identity 3 : IdentityDbContext 구현에서의 클레임 캐싱

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

문제

요청을하는 사용자가 아닌 다른 사용자를 위해 관리 컨트롤러를 통해 역할을 할당하고 취소 할 수있는 방법을 찾고있는 동안 Claim으로 저장된 Guid 태그가 다음과 같은 값과 일치하는지 확인하는 사용자 정의 IAuthorizeFilter를 구현했습니다. UserClaims에 대한 Entity Framework 7 코드 첫 번째 ID 테이블.

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 지정하는 줄에서 문제가 발생했습니다. 다음과 같은 방식으로 훨씬 더 읽기 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 injector가 이전에 DbSet을 채워서 데이터베이스 쿼리를 수행하는 대신 캐시 된 데이터를 반환하는 데이터베이스 컨텍스트의 인스턴스가있는 것처럼 보입니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.