Ansprüche in IdentityServer4/AspnetIdentity-JwtToken einschließen

Ansprüche in IdentityServer4/AspnetIdentity-JwtToken einschließen

Lösung für Include-Ansprüche in IdentityServer4/AspnetIdentity JwtToken
ist unten angegeben:

Ich habe eine neue React-Webanwendung mit Visual Studio und der React-Anwendungsvorlage erstellt:https://docs.microsoft.com/en-us/aspnet/core/client-side/spa/react?view=aspnetcore-5.0&tabs=visual -studio

Als ich die App erstellt habe, habe ich auch die Authentifizierungsoption für individuelle Benutzerkonten ausgewählt:

Ich habe eine Autorisierungsrichtlinie wie folgt erstellt:

services.AddAuthorization(config =>
        {
            config.AddPolicy("ShouldBeAdmin",
                options => options.RequireClaim("Admin"));
        });

Meinem Benutzer in der Aspnet-Identitätsdatenbank war die folgende Behauptung zugeordnet:

Wenn ich mich mit meinem Benutzer anmelde, enthält das jwt-Token, das ich erhalte, nicht den Admin-Claim, sodass Endpunkte, die mit meiner Autorisierungsregel geschützt sind, nicht funktionieren. Wie bringe ich die Ansprüche in das jwt-Token?

Ich habe eine Problemumgehung für dieses Problem. Dadurch werden die Ansprüche zwar nicht zum jwt-Token hinzugefügt, aber ich kann die Ansprüche jedes Mal, wenn eine Anfrage eingeht, in der Datenbank nachschlagen, indem ich das onTokenValidated-Ereignis verwende. Etwa so:

services.Configure<JwtBearerOptions>(
            IdentityServerJwtConstants.IdentityServerJwtBearerScheme,
            options =>
            {
                var onTokenValidated = options.Events.OnTokenValidated;
                options.Events.OnTokenValidated = async context =>
                {
                    await onTokenValidated(context);
                    var userManger = context.HttpContext.RequestServices
                        .GetRequiredService<UserManager<ApplicationUser>>();
                    var user = await userManger.FindByIdAsync(context.Principal?.FindFirst(ClaimTypes.NameIdentifier)?.Value);
                    if (user == null)
                    {
                        return;
                    }
                    var claims = await userManger.GetClaimsAsync(user);
                    var appIdentity = new ClaimsIdentity(claims);
                    context.Principal?.AddIdentity(appIdentity);
                };
            });

Diese Lösung basiert auf dieser Microsoft-Dokumentation:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity-api-authorization?view=aspnetcore-5.0#customize-the-api-authentication -Handler

Und dieser Blob-Post:
https://joonasw.net/view/adding-custom-claims-aspnet-core-2

Ich versuche immer noch, IProfileService basierend auf dem Kommentar von abdusco zu implementieren.