Einfache Autorisierung in ASP.NET Core Razor Pages

Die Autorisierung in ASP.NET Core wird mit dem Attribut [Authorize] und den verschiedenen Parametern gesteuert. In ihrer einfachsten Form beschränkt das Anwenden des [Authorize]-Attributs auf eine Razor-Komponente, einen Controller, eine Aktion oder eine Razor-Seite den Zugriff auf authentifizierte Benutzer.

In diesem Artikel werden Szenarien behandelt, die sich auf Pages-Apps beziehen. Weitere Informationen finden Sie unter Simple authorization in ASP.NET Core.

-Attribut

Wenden Sie das Attribut auf die Seitenmodellklasse an, die von . Im folgenden Beispiel können nur authentifizierte Benutzer die Seite erreichen:

[Authorize]
public class LogoutModel : PageModel
{
    public async Task OnGetAsync() { ... }
    public async Task<IActionResult> OnPostAsync() { ... }
}

Das Attribut unterstützt auch die rollenbasierte oder richtlinienbasierte Autorisierung. Verwenden Sie für die rollenbasierte Autorisierung den -Parameter. Im folgenden Beispiel kann der Benutzer die Seite nur access, wenn er sich in der Rolle Admin oder Superuser befindet:

[Authorize(Roles = "Admin, Superuser")]
public class OrderModel : PageModel
{
    ...
}

Verwenden Sie für die richtlinienbasierte Autorisierung den Parameter. Im folgenden Beispiel kann der Benutzer die Seite nur access, wenn er die Anforderungen der Over21Authorisierungsrichtlinie erfüllt:

[Authorize(Policy = "Over21")]
public class LicenseApplicationModel : PageModel
{
    ...
}

Wenn weder noch angegeben wird, verwendet die Standardrichtlinie:

  • Authentifizierte (angemeldete) Benutzer werden autorisiert.
  • Nicht authentifizierte (abgemeldete) Benutzer werden nicht autorisiert.

Anleitungen zu seitenhandlern und Seitenhandlern finden Sie im Abschnitt "Pages-Apps ".

Verwenden Sie das Attribut [AllowAnonymous], um nicht authentifizierten Benutzern den Zugriff auf einzelne Aktionen zu ermöglichen.

[AllowAnonymous]

Informationen zum Anfordern der Authentifizierung für alle App-Benutzer finden Sie unter Erstellen Sie eine ASP.NET Core-App mit durch Autorisierung geschützten Benutzerdaten.

Attribut in Seiten-Apps

Dies kann nicht auf Seitenhandler angewendet werden. Ein Beispiel: Das Attribut kann nicht auf , oder einen anderen Seitenhandler angewendet werden. In einer Razor Pages-App sollten Sie einen ASP.NET Core MVC-Controller für Seiten mit unterschiedlichen Autorisierungsanforderungen für unterschiedliche Handler verwenden. Die Verwendung eines Controllers, wenn unterschiedliche Autorisierungsanforderungen erforderlich sind, ist der am wenigsten komplexe Ansatz, den wir empfehlen.

Wenn Sie keinen MVC-Controller verwenden möchten, kann die Anwendung der Autorisierung auf -Seitenhandlermethoden über die folgenden beiden Ansätze erfolgen:

  • Verwenden Sie separate Seiten für Seitenhandler mit unterschiedlichen Autorisierungsanforderungen. Verschieben Sie freigegebene Inhalte in eine oder mehrere Partial Views. Diese Herangehensweise wird nach Möglichkeit empfohlen.
  • Für Inhalte, die gemeinsam auf einer Seite dargestellt werden müssen, schreiben Sie einen Filter, der die Autorisierung als Teil der Vorgangsbearbeitung durchführt. Dieser Ansatz wird im folgenden Beispiel veranschaulicht.

Der Autorisierungsfilter wird implementiert:

public class AuthorizeIndexPageHandlerFilter(
    IAuthorizationPolicyProvider policyProvider,
    IPolicyEvaluator policyEvaluator) : IAsyncPageFilter, IOrderedFilter
{
    private readonly IAuthorizationPolicyProvider policyProvider = 
        policyProvider;
    private readonly IPolicyEvaluator policyEvaluator = policyEvaluator;

    // Run late in the execution pipeline
    public int Order => 10000;

    public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context,
        PageHandlerExecutionDelegate next)
    {
        var attribute = context.HandlerMethod?.MethodInfo?
            .GetCustomAttribute<AuthorizePageHandlerAttribute>();

        if (attribute is null)
        {
            await next();
            return;
        }

        var policy = await AuthorizationPolicy
            .CombineAsync(policyProvider, new[] { attribute });

        if (policy is null)
        {
            await next();
            return;
        }

        var httpContext = context.HttpContext;
        var authenticateResult = await policyEvaluator
            .AuthenticateAsync(policy, httpContext);
        var authorizeResult = await policyEvaluator
            .AuthorizeAsync(policy, authenticateResult, httpContext,
                context.ActionDescriptor);

        if (authorizeResult.Challenged)
        {
            context.Result = policy.AuthenticationSchemes.Count > 0
                ? new ChallengeResult(policy.AuthenticationSchemes.ToArray())
                : new ChallengeResult();

            return;
        }
        else if (authorizeResult.Forbidden)
        {
            context.Result = policy.AuthenticationSchemes.Count > 0
                ? new ForbidResult(policy.AuthenticationSchemes.ToArray())
                : new ForbidResult();

            return;
        }

        await next();
    }

    public Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context)
        => Task.CompletedTask;
}

Die App stellt ein Attribut bereit:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class AuthorizePageHandlerAttribute(string policy = null) 
    : Attribute, IAuthorizeData
{
    public string Policy { get; set; } = policy;
    public string Roles { get; set; }
    public string AuthenticationSchemes { get; set; }
}

Das Attribut wird auf Seiten-Handler angewendet. Im folgenden Beispiel wird das Attribut im Seitenhandler festgelegt:

[TypeFilter(typeof(AuthorizeIndexPageHandlerFilter))]
public class IndexModel : PageModel
{
    ...

    [AuthorizePageHandler]
    public void OnPostAuthorized() { ... }
}

Warnung

Der vorstehende Ansatz tut Folgendes nicht:

  • Schreiben Sie unter Berücksichtigung von Autorisierungsattributen, die auf die Seite, das Seitenmodell oder global angewandt wurden. Das Kombinieren von Autorisierungsattributen führt dazu, dass die Authentifizierung und Autorisierung mehrmals ausgeführt werden, wenn ein zusätzliches Attribut oder eine Instanz auch auf die Seite angewendet wird.
  • Arbeiten Sie in Verbindung mit dem restlichen ASP.NET Core Authentifizierungs- und Autorisierungssystem. Stellen Sie sicher, dass dieser Ansatz für die App ordnungsgemäß funktioniert.

Es gibt keine Pläne, das Attribut in Seitenhandlern zu unterstützen.

Weitere Ressourcen