User.Claims ist in der MVC-Anwendung leer

8

Ich arbeite daran, meine .NET Core 2.2 MVC-Anwendung auf 3.0 zu aktualisieren. In dieser Anwendung authentifiziere ich mich bei einem Controller mithilfe eines JWT-Tokens. Das Token enthält mehrere Ansprüche, aber wenn ich versuche, über User.Claimsdie resultierende Liste darauf zuzugreifen, ist es immer leer.

In meinem habe Startup.csich das Authentifizierungssetup wie folgt:

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

In Core 2.2 konnte ich mit einem Code wie dem folgenden auf meine Ansprüche zugreifen:

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

Wenn ich jedoch denselben Code auf Core 3.0 migriere, authentifiziere ich mich ordnungsgemäß, erhalte jedoch keine Ansprüche für das UserObjekt. Geben Sie hier die Bildbeschreibung ein

Habe ich einen Schritt bei der Konvertierung in 3.0 verpasst? Wird Usernicht mehr automatisch mit Informationen gefüllt oder so?

Chris Stillwell
quelle
Können Sie bestätigen, dass der Benutzer authentifiziert ist? Ich kann auf dem Bild nichts sehen, aber es User.Identity.IsAuthenticatedscheint falsch zu sein. Wenn ja, hat dies möglicherweise mit dem AuthenticationScheme zu tun.
Ruard van Elburg
1
Wie haben Sie das Routing konfiguriert? Haben Sie UseRouting, UseAuthentication und UseAuthorization in dieser Reihenfolge vor UseEndpoints hinzugefügt? Können Sie diesen Code zeigen?
Ruard van Elburg
@RuardvanElburg Ich bin UseEndpointsans Ende der ConfigureMethode gegangen und das hat die Dinge behoben. Heilige Kuh, ich kann nicht glauben, dass so etwas Einfaches mich peinlich viel Zeit gekostet hat. Wenn du das als Antwort posten willst, werde ich es akzeptieren.
Chris Stillwell

Antworten:

2

Es scheint, dass der Benutzer überhaupt nicht authentifiziert ist.

Mit asp.net Core 3.0 wurde das Routing auf Endpoint-Routing geändert. Sie können sich durch Einstellen abmelden EnableEndpointRouting = false.

Dies scheint hier jedoch nicht der Fall zu sein. Das bedeutet, dass Sie bestimmte Dienste einbeziehen müssen, wenn Sie sie verwenden, z. B. Authentifizierung und Autorisierung:

public void Configure(IApplicationBuilder app)
{
  ...

  app.UseStaticFiles();

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

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

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

Und das Wichtigste in dieser Reihenfolge . Wie hier dokumentiert: Migrieren Sie Startup.Configure .

Ruard van Elburg
quelle
Weitere Informationen zur Bestellung finden Sie in der Dokumentation
Ruard van Elburg