User.Claims está vazio no aplicativo MVC

8

Estou trabalhando para atualizar meu aplicativo .NET Core 2.2 MVC para 3.0. Nesta aplicação, estou me autenticando em um controlador usando um token JWT. O token contém várias declarações, mas quando tento acessá-las através User.Claimsda lista resultante, sempre está vazio.

No meu Startup.cseu tenho a configuração de autenticação da seguinte forma:

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"
                };
            });
    }
}

No Core 2.2, consegui acessar minhas reivindicações usando um código semelhante ao seguinte:

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

No entanto, quando migro o mesmo código para o Core 3.0, faço a autenticação corretamente, mas não recebo reivindicações para o Userobjeto. insira a descrição da imagem aqui

Perdi um passo na conversão para 3.0? Não Useré mais preenchido automaticamente com informações ou algo assim?

Chris Stillwell
fonte
Você pode confirmar que o usuário está autenticado? Não vejo a imagem, mas User.Identity.IsAuthenticatedparece falso. Nesse caso, isso pode ter a ver com o AuthenticationScheme.
Ruard van Elburg
1
Como você configurou o roteamento? Você adicionou UseRouting, UseAuthentication e UseAuthorization nessa ordem antes de UseEndpoints? Você pode mostrar esse pedaço de código?
Ruard van Elburg
@ RuardvanElburg Mudei UseEndpointspara o final do Configuremétodo e isso consertou as coisas. Vaca sagrada, eu não posso acreditar que algo tão simples assim tenha me custado uma quantidade embaraçosa de tempo. Se você quiser postar isso como resposta, eu aceito.
21919 Chris Stillwell

Respostas:

2

Parece que o usuário não está autenticado.

Com o asp.net core 3.0, o roteamento foi alterado para Endpoint. Você pode optar por excluir definindo EnableEndpointRouting = false.

Mas esse não parece ser o caso aqui. Isso significa que você precisará incluir determinados serviços ao usá-los, como autenticação e autorização:

public void Configure(IApplicationBuilder app)
{
  ...

  app.UseStaticFiles();

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

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

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

E o mais importante, nessa ordem . Conforme documentado aqui: Migrar Startup.Configure .

Ruard van Elburg
fonte
Para obter mais informações sobre o pedido, consulte a documentação
Ruard van Elburg,