Asp.Net 5 / Identity 3: memorizzazione nella cache di attestazioni nell'implementazione di IdentityDbContext

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

Domanda

Mentre cerco un modo per essere in grado di assegnare e revocare ruoli tramite un controller di amministrazione per utenti diversi da quello che effettua una richiesta, ho implementato un IAuthorizeFilter personalizzato che controlla se il tag Guid, memorizzato come Claim, corrisponde a un valore in la tabella Identity First Code di Entity Framework 7 per UserClaims.

Essentials, è questo codice:

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

Sto avendo il problema sulla linea in cui sto assegnando var stampFromDb , potrebbe essere molto più leggibile nel modo seguente:

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

Questo, tuttavia, mi dà in cache (gli stessi valori dei reclami effettivi da User.Identity) e non sono riuscito a trovare alcuna documentazione su questo. La mia ipotesi migliore è che l'errore sia da qualche parte dalla mia parte, ma non ho mai riscontrato un problema simile prima. Questa è la prima volta che utilizzo Asp.Net 5 e EF7. Sto usando la connessione predefinita (LocalDB) per SQL Server 12.0.2000.

È una funzionalità e, se sì, può essere disattivata o ho fatto un errore da qualche parte?

Risposta accettata

Il problema è stato causato dal fatto che ci sono due modi diversi per creare un servizio tramite l'iniezione delle dipendenze: il codice di esempio nella mia domanda utilizzato

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

dove dovrebbe usare

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

La differenza qui è tra ApplicationServices e RequestServices . Sembra che l'iniettore ApplicationServices abbia un'istanza del contesto del database da qualche parte che ha avuto il DbSet compilato in precedenza e quindi restituisce i dati memorizzati nella cache invece di eseguire una query del database.




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché