User.Claims está vacío en la aplicación MVC

8

Estoy trabajando para actualizar mi aplicación .NET Core 2.2 MVC a 3.0. En esta aplicación, me autentico en un controlador utilizando un token JWT. El token contiene varios reclamos, pero cuando intento acceder a ellos a través de User.Claimsla lista resultante siempre está vacío.

En mi Startup.cstengo la configuración de autenticación de esta manera:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Code removed for clarity //

        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = JwtManager.Issuer,
                    ValidAudience = "MyAudience",
                    IssuerSigningKey = "MySigningKey"
                };
            });
    }
}

En Core 2.2 pude acceder a mis reclamos usando un código similar al siguiente:

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class MyController : Controller
{
    [HttpGet("MyController/Action")]
    public ActionResult<Aggregate[]> GetAction()
    {
        var username = User.FindFirstValue("MyUsernameClaim");
        if (username == null)
        {
            return Forbid();
        }       
        // Do Stuff //
    }
}

Sin embargo, cuando migro el mismo código a Core 3.0, me autentico correctamente, pero no recibo ningún reclamo por el Userobjeto. ingrese la descripción de la imagen aquí

¿Me perdí un paso al convertir esto a 3.0? ¿ UserYa no se rellena automáticamente con información o algo así?

Chris Stillwell
fuente
¿Puedes confirmar que el usuario está autenticado? No puedo ver desde la imagen, pero User.Identity.IsAuthenticatedparece falso. Si es así, entonces esto puede tener que ver con AuthenticationScheme.
Ruard van Elburg
1
¿Cómo configuró el enrutamiento? ¿Agregó UseRouting, UseAuthentication y UseAuthorization en ese orden antes de UseEndpoints? ¿Puedes mostrar esa pieza de código?
Ruard van Elburg
@RuardvanElburg Me mudé UseEndpointsal final del Configuremétodo y eso solucionó las cosas. Santa vaca, no puedo creer que algo tan simple como eso me haya costado una cantidad de tiempo embarazosa. Si quieres publicar eso como respuesta, lo aceptaré.
Chris Stillwell

Respuestas:

2

Parece que el usuario no está autenticado en absoluto.

Con asp.net core 3.0, el enrutamiento ha cambiado a enrutamiento de Endpoint. Puede optar por salir configurando EnableEndpointRouting = false.

Pero ese no parece ser el caso aquí. Eso significa que tendrá que incluir ciertos servicios cuando los use, como autenticación y autorización:

public void Configure(IApplicationBuilder app)
{
  ...

  app.UseStaticFiles();

  app.UseRouting();
  app.UseCors();

  app.UseAuthentication();
  app.UseAuthorization();

  app.UseEndpoints(endpoints => {
     endpoints.MapControllers();
  });

Y lo más importante, en ese orden . Como se documenta aquí: Migrate Startup.Configure .

Ruard van Elburg
fuente
Para obtener más información sobre el pedido, consulte la documentación
Ruard van Elburg,