AuthorizeAttribute mit Rollen, die bei der Migration von MVC zu Endpoint Routing in ASP.NET Core 3.1 nicht funktionieren

Nov 26 2020

Ich versuche, mein Projekt von .UseMVC (asp.net Core 2.2-Kompatibilitätsstil) auf .UseEndpoint Routing zu aktualisieren, und werde für alle meine Anforderungen auf meine Seite mit fehlgeschlagener Authentifizierung umgeleitet. Es hat mit den Ansprüchen zu tun - Wenn ich den Rollenteil von [Authorize (Roles = "Admin")] zu einfach [Authorize] entferne, funktioniert es. Es scheint, dass die dem Benutzer zugewiesenen Ansprüche nicht erfasst werden.

Es scheint ein sehr ähnliches Problem zu sein, da AuthorizeAttribute nicht mit Endpoint Routing in ASP.NET Core 3.1 funktioniert

Der folgende Absatz ist ein Auszug aus dem verlinkten Beitrag, wurde jedoch geändert, um meine Version des Problems widerzuspiegeln

In 2.2 funktionierte alles einwandfrei, aber nach der Migration auf 3.1 und dem Aktivieren des Endpunktroutings lehnte dieser Controller Anforderungen an einen Endpunkt ab, wenn das Attribut [Authorize (Roles = "Admin")] vorhanden war. Wenn ich den Teil "Roles =" entferne und User.Claims betrachte, sehe ich, dass er die erforderlichen Ansprüche / Rollen hat. Dies geschieht nur, wenn Endpoint Routing aktiviert ist. Bei Verwendung von UseMvc funktioniert alles ordnungsgemäß. Was ist falsch an der Autorisierung im Endpoint Routing-Modus?

Auszug aus Startup.cs

 app.UseSession();
    
 app.UseRouting();
    
 app.UseAuthentication();
 app.UseAuthorization();
 app.UseResponseCompression();
 //Add the users Roles as claims to his identity so that it is picked up for authentication purposes
 app.Use((context, next) =>
 {
     var userId = context.User.Identity.Name;
     if (userId == null)
     {
         return next();
     }
    
     ...
        
     var roles = resourceDataAccess.GetRolesForUser(userId);
     if (roles != null)
     {
         var claims = roles.Select(role => new Claim(ClaimTypes.Role, role.RoleEnum.ToString())).ToList();
    
         var appIdentity = new ClaimsIdentity(claims);
         context.User.AddIdentity(appIdentity);
     }
    
     return next();
 });
 app.UseEndpoints(endpoints =>
 {
     endpoints.MapHub<AppHub>("api/apphub");
     endpoints.MapControllerRoute("default", "api/{controller=Account}/{action=SignIn}/{id?}");
     endpoints.MapControllerRoute("catch-all", "api/{*url}",
             new {controller = "Utility", action = "NotFoundPage"});
 });

Antworten

2 akraines Nov 29 2020 at 16:00

Da wir die Middleware app.Use () zum Ausfüllen der Benutzerrollen aus der Datenbank verwendet haben, musste sie vor UseAuthorisation aufgerufen werden, damit die Rollen vor der Autorisierung geladen wurden. (Gefällt mir @ CamiloTerevintos Kommentar)

 app.UseSession();
    
 app.UseRouting();
    
 app.UseAuthentication();
 //Add the users Roles as claims to his identity so that it is picked up for authentication purposes
 app.Use((context, next) =>
 {
   ...
 }
 //Setup the authorisation middleware to run only after we have loaded the users roles.
 app.UseAuthorization();
 app.UseResponseCompression();