Implémentation de l'authentification et de l'autorisation par Cookie dans une application ASP.NET Core

Configuration de l'authentification dans Program.cs

builder.Services.AddAuthentication(authOptions => { authOptions.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; authOptions.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme; authOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; authOptions.DefaultSignOutScheme = CookieAuthenticationDefaults.AuthenticationScheme; authOptions.DefaultForbidScheme = CookieAuthenticationDefaults.AuthenticationScheme; }).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, cookieOptions => { cookieOptions.LoginPath = "/Utilisateur/Connexion"; // Redirection si non authentifié cookieOptions.AccessDeniedPath = "/Utilisateur/NonAutorise"; // Redirection si accès refusé });


</div><div>```

app.UseAuthentication(); // Middleware d'authentification
app.UseAuthorization();  // Middleware d'autorisation

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;

namespace ApplicationDemo.Controllers
{
    public class UtilisateurController : Controller
    {
        [Authorize]
        public IActionResult TableauDeBord()
        {
            return View();
        }

        [HttpGet]
        public IActionResult Connexion()
        {
            return View();
        }

        [HttpPost]
        public async Task<iactionresult> Connexion(string identifiant, string motDePasse)
        {
            if("admin".Equals(identifiant) && "secret".Equals(motDePasse))
            {
                var revendications = new List<Claim>()
                {
                    new Claim("IdUtilisateur","101"),
                    new Claim(ClaimTypes.Role,"Administrateur"),
                    new Claim(ClaimTypes.Name,identifiant),
                    new Claim(ClaimTypes.Email,"contact@exemple.com"),
                    new Claim("compte","Gestionnaire")
                };
                var identite = new ClaimsIdentity(revendications, "Personnalise");
                var principal = new ClaimsPrincipal(identite);
                await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal, new AuthenticationProperties()
                {
                    ExpiresUtc = DateTime.UtcNow.AddHours(1),
                });
                return RedirectToAction("TableauDeBord");
            }
            else
            {
                ViewBag.Message = "Identifiant ou mot de passe incorrect";
                return View();
            }
        }
    }
}
</iactionresult>

Modèle de données Utilisateur


namespace Modeles
{
    public class Utilisateur
    {
        public string Identifiant { get; set; }
        public string MotDePasse { get; set; }
    }
}

Vue pour la connexion (Connexion.cshtml)


@using Modeles
@model Utilisateur
<section>
    @using (Html.BeginForm("Connexion", "Utilisateur", FormMethod.Post, new { @class = "formulaire-connexion" }))
    {
        @Html.AntiForgeryToken()
        <div>
            <label>Identifiant</label>
            @Html.TextBoxFor(m => m.Identifiant)
        </div>
        <div>
            <label>Mot de passe</label>
            @Html.PasswordFor(m => m.MotDePasse)
        </div>
        <button type="submit">Se connecter</button>
        @ViewBag.Message
    }
</section>

Autorisation par rôle et par stratégie

Configuration des stratégies d'autorisation dans Program.cs :


builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("StrategieAdmin", policyBuilder =>
    {
        policyBuilder.RequireRole("Administrateur");
    });
    options.AddPolicy("StrategieCompte", policyBuilder =>
    {
        policyBuilder.RequireClaim("compte", new[] { "Gestionnaire", "Testeur" });
    });
    options.AddPolicy("StrategiePersonnalisee", policyBuilder =>
    {
        policyBuilder.RequireAssertion(contexte =>
        {
            return contexte.User.HasClaim(c => c.Type == ClaimTypes.Role)
                   && contexte.User.Claims.First(c => c.Type == ClaimTypes.Role).Value == "Administrateur"
                   && contexte.User.Claims.Any(c => c.Type == ClaimTypes.Name);
        });
    });
});

Exemples d'utilisation dans le contrôleur :


[Authorize(Roles = "Administrateur")]
public IActionResult TableauDeBordAdmin() { ... }

[Authorize(Policy = "StrategieAdmin")]
public IActionResult SectionAdmin() { ... }

[Authorize(Roles = "Administrateur,Editeur")]
public IActionResult ZonePartagee() { ... }

Intégration de logique métier pour l'autorisation

Création d'un service pour la validation métier :


namespace Services
{
    public interface IValidationService
    {
        bool VerifierAcces(string idUtilisateur, string codeSecret);
    }

    public class ValidationService : IValidationService
    {
        public bool VerifierAcces(string idUtilisateur, string codeSecret)
        {
            return idUtilisateur == "101" && codeSecret == "ABCDE";
        }
    }
}

Définition d'une exigence d'autorisation et d'un gestionnarie :


using Microsoft.AspNetCore.Authorization;

namespace Utilitaires
{
    public class ExigenceCodeSecret : IAuthorizationRequirement { }

    public class GestionnaireCodeSecret : AuthorizationHandler<ExigenceCodeSecret>
    {
        private readonly IValidationService _validationService;

        public GestionnaireCodeSecret(IValidationService service)
        {
            _validationService = service;
        }

        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ExigenceCodeSecret exigence)
        {
            string idUtilisateur = context.User.Claims.FirstOrDefault(c => c.Type == "IdUtilisateur")?.Value;
            string code = context.User.Claims.FirstOrDefault(c => c.Type == "code")?.Value;

            if (idUtilisateur != null && code != null && _validationService.VerifierAcces(idUtilisateur, code))
            {
                context.Succeed(exigence);
            }
            return Task.CompletedTask;
        }
    }
}

Enregistrement des services et configuraton de la stratégie :


builder.Services.AddScoped<IValidationService, ValidationService>();
builder.Services.AddScoped<IAuthorizationHandler, GestionnaireCodeSecret>();

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("StrategieCodeSecret", policyBuilder =>
    {
        policyBuilder.AddRequirements(new ExigenceCodeSecret());
    });
});

Application dans le contrôleur :


[Authorize(Policy = "StrategieCodeSecret")]
public IActionResult SectionSecrete()
{
    return View();
}

Étiquettes: ASP.NET Core Authentification Cookie autorisation C#

Publié le 24 juillet à 07h22