jeudi 9 juillet 2020

ASP.NET Core Manage Authorize Policy

Ce sujet c'est comment gérer les autorisations au sein des applications ASP.NET Core ? Pour l'instant je connais deux mécanismes :

Dans le Startup.cs l'Authorise policy, exemple :

// Usage : [Authorize(Policy = "AdminPolicy")]
services.AddAuthorization( options => {
options.AddPolicy( "AdminPolicy",
builder => builder.RequireRole( Roles.Admin ) );
} );

Et dans le code, aller chercher une Claim de l'utilisateur mais c'est pas mal de code. Par exemple, mon Utilisateur possède un bool IsAdmin que je suis le seul à gérer (oui, j'ai fait comme ça) si je veux aller tester dans mon code ce bool pour savoir si j’octroie les droits ou non à l'utilisateur d'effectuer l'action.

Dans le contrôleur de l'action, voici le code :

    public class RoleController : Controller
    {
    private UserManager<ApplicationUser> userManager;

        public RoleController( UserManager<ApplicationUser> userManager )
        {
            this.userManager = userManager;
        }


[HttpPost]
        public async Task<IActionResult> Delete( string id )
        {
            var user = await userManager.GetUserAsync( User );
            if ( user.IsAdmin == false ) 
            {
                return RedirectToAction( nameof( HomeController.ErrorUserIsNotSuperAdmin ), "Home" );
            }

Mais bon, je ne vais pas écrire ce code pour tout les composants de mon application qui ont besoin de savoir de quel utilisateur il s'agit pour octroyer ou non les actions, ce serait fastidieux et rébarbatif.

Note de l'auteur (moi) : Au passage je réponds à une question souvent posé dans la StackOverflow :

stackoverflow - How to get current user in asp.net core

Curieux de voir à quel point cette communauté se perd elle même. Ils manquent de modérateurs à mon goût pour supprimer les mauvaises réponses car ils ne trouve pas de réponse correcte à des questions pourtant toutes simples. Peut être que c'est l'indexation de googoole qui le mets dans le vent...

Du coût je regarde la définition de RequireRole et juste à côté je remarque le définition de RequireAssertion alors ma chaine de recherche devient :

ASP.NET Core Authorize Policy Requires Assertion example

Et je tombe sur la bonne page :

MSDN - Policy-based authorization in ASP.NET Core

Et je tombe là dessus :

[Authorize(Roles = "Administrator")]

Grrrr ! Je conserve quand même mon AdminPolicy qui est plus facile à faire évoluer et qui est un bon exemple si je souhaite évoluer. Et finalement ce que je veux faire, peut se faire simplement par :

services.AddAuthorization(options =>
{
options.AddPolicy("IsSuperAdmin", policy => policy.RequireClaim( "role", "SuperAdmin"));
});

Et dans : StsIdentityServer\IdentityWithAdditionalClaimsProfileService.cs
public async Task GetProfileDataAsync( ProfileDataRequestContext context )
{
if ( user.IsAdmin )
{
claims.Add( new Claim( JwtClaimTypes.Role, "SuperAdmin" ) );
}

Le tour est joué, il ne me reste plus qu'à tester.

Aucun commentaire:

Publier un commentaire