Asp.Net 5 / Identity 3: Almacenamiento de notificaciones en la implementación de IdentityDbContext

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

Pregunta

Mientras buscaba una manera de poder asignar y revocar roles a través de un controlador de administración para usuarios distintos al que realiza una solicitud, implementé un IAuthorizeFilter personalizado que verifica si la etiqueta Guid, almacenada como Reclamación, coincide con un valor La tabla de Identity del Código Entity Framework 7 First para UserClaims.

Lo esencial, es este código:

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

Tengo un problema en la línea donde asigno var stampFromDb , podría ser mucho más legible de la siguiente manera:

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

Sin embargo, eso me da resultados almacenados en caché (los mismos valores que los reclamos reales de User.Identity) y no pude encontrar ninguna documentación sobre esto. Mi mejor conjetura es que el error está en alguna parte de mi lado, pero nunca antes había encontrado un problema así. Esta es la primera vez que estoy usando Asp.Net 5 y EF7. Estoy usando la conexión predeterminada (LocalDB) a SQL Server 12.0.2000.

¿Es esta una característica y, en caso afirmativo, puede desactivarse o cometí un error en alguna parte?

Respuesta aceptada

El problema se debió a la existencia de dos formas diferentes de crear un servicio a través de la inyección de dependencias: el código de muestra utilizado en mi pregunta

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

donde se debe usar

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

La diferencia aquí es entre ApplicationServices y RequestServices . Parece que el inyector ApplicationServices tiene una instancia del contexto de la base de datos en algún lugar donde se llenó el DbSet anteriormente y, por lo tanto, devolvió datos en caché en lugar de hacer una consulta de la base de datos.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué