Partager via


Personnaliser le comportement de l’élément AuthorizationMiddleware

Les applications peuvent inscrire un IAuthorizationMiddlewareResultHandler pour personnaliser la façon dont AuthorizationMiddleware gère les résultats de l’autorisation. Les applications peuvent utiliser IAuthorizationMiddlewareResultHandler pour :

  • Retourne des réponses personnalisées.
  • Améliorer les réponses par défaut du défi ou de l’interdiction.

Le code suivant montre un exemple d’implémentation de IAuthorizationMiddlewareResultHandler qui retourne une réponse personnalisée pour des échecs de l’autorisation spécifiques :

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Authorization.Policy;

public class SampleAuthorizationMiddlewareResultHandler : IAuthorizationMiddlewareResultHandler
{
    private readonly AuthorizationMiddlewareResultHandler defaultHandler = new();

    public async Task HandleAsync(
        RequestDelegate next,
        HttpContext context,
        AuthorizationPolicy policy,
        PolicyAuthorizationResult authorizeResult)
    {
        // If the authorization was forbidden and the resource had a specific requirement,
        // provide a custom 404 response.
        if (authorizeResult.Forbidden
            && authorizeResult.AuthorizationFailure!.FailedRequirements
                .OfType<Show404Requirement>().Any())
        {
            // Return a 404 to make it appear as if the resource doesn't exist.
            context.Response.StatusCode = StatusCodes.Status404NotFound;
            return;
        }

        // Fall back to the default implementation.
        await defaultHandler.HandleAsync(next, context, policy, authorizeResult);
    }
}

public class Show404Requirement : IAuthorizationRequirement { }

Inscrivez cette implémentation de IAuthorizationMiddlewareResultHandler dans Program.cs :

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddSingleton<
    IAuthorizationMiddlewareResultHandler, SampleAuthorizationMiddlewareResultHandler>();

var app = builder.Build();

Les applications peuvent inscrire un IAuthorizationMiddlewareResultHandler pour personnaliser la façon dont AuthorizationMiddleware gère les résultats de l’autorisation. Les applications peuvent utiliser IAuthorizationMiddlewareResultHandler vers :

  • Retourne des réponses personnalisées.
  • Améliorer les réponses par défaut du défi ou de l’interdiction.

Le code suivant montre un exemple d’implémentation de IAuthorizationMiddlewareResultHandler qui retourne une réponse personnalisée pour des échecs de l’autorisation spécifiques :

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Authorization.Policy;
using Microsoft.AspNetCore.Http;
using System.Linq;
using System.Net;
using System.Threading.Tasks;

public class MyAuthorizationMiddlewareResultHandler : IAuthorizationMiddlewareResultHandler
{
   private readonly AuthorizationMiddlewareResultHandler 
        DefaultHandler = new AuthorizationMiddlewareResultHandler();
    
    public async Task HandleAsync(
        RequestDelegate requestDelegate,
        HttpContext httpContext,
        AuthorizationPolicy authorizationPolicy,
        PolicyAuthorizationResult policyAuthorizationResult)
    {
        // if the authorization was forbidden and the resource had specific requirements,
        // provide a custom response.
        if (Show404ForForbiddenResult(policyAuthorizationResult))
        {
            // Return a 404 to make it appear as if the resource does not exist.
            httpContext.Response.StatusCode = (int)HttpStatusCode.NotFound;
            return;
        }

        // Fallback to the default implementation.
        await DefaultHandler.HandleAsync(requestDelegate, httpContext, authorizationPolicy, 
                               policyAuthorizationResult);
    }

    bool Show404ForForbiddenResult(PolicyAuthorizationResult policyAuthorizationResult)
    {
        return policyAuthorizationResult.Forbidden &&
            policyAuthorizationResult.AuthorizationFailure.FailedRequirements.OfType<
                                                           Show404Requirement>().Any();
    }
}

public class Show404Requirement : IAuthorizationRequirement { }

Inscrivez MyAuthorizationMiddlewareResultHandler dans Startup.ConfigureServices :

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddSingleton<IAuthorizationMiddlewareResultHandler,
                          MyAuthorizationMiddlewareResultHandler>();
}