Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La autorización en ASP.NET Core se controla con el atributo [Authorize] y sus distintos parámetros. En su forma más básica, aplicar el atributo [Authorize] a un componente Razor, controlador, acción o Razor Página, limita el acceso a ese componente a los usuarios autenticados.
En este artículo se tratan los escenarios que pertenecen a las aplicaciones de Pages. Para obtener más información, consulte autorización Simple en ASP.NET Core.
atributo
Aplique el atributo a la clase de modelo de página que deriva de . En el ejemplo siguiente, solo los usuarios autenticados pueden acceder a la página:
[Authorize]
public class LogoutModel : PageModel
{
public async Task OnGetAsync() { ... }
public async Task<IActionResult> OnPostAsync() { ... }
}
El atributo también admite la autorización basada en roles o basada en directivas. Para la autorización basada en roles, utilice el parámetro . En el ejemplo siguiente, el usuario solo puede acceder a la página si se encuentra en el rol Admin o Superuser.
[Authorize(Roles = "Admin, Superuser")]
public class OrderModel : PageModel
{
...
}
Para la autorización basada en directivas, use el parámetro . En el ejemplo siguiente, el usuario solo puede acceder a la página si cumple los requisitos de la Over21política de autorización:
[Authorize(Policy = "Over21")]
public class LicenseApplicationModel : PageModel
{
...
}
Si no se especifica ni , usa la directiva predeterminada:
- Se autoriza a los usuarios autenticados (con sesión iniciada).
- Se considera no autorizados a los usuarios no autenticados (cerraron sesión).
Para obtener instrucciones sobre los manejadores de página y otros elementos pertinentes, consulte el atributo en la sección de aplicaciones Pages.
Use el atributo [AllowAnonymous] para permitir que los usuarios no autenticados accedan a acciones individuales.
[AllowAnonymous]
Para obtener información sobre cómo requerir autenticación para todos los usuarios de la aplicación, consulte Crear una aplicación de ASP.NET Core con datos de usuario protegidos por autorización.
atributo en aplicaciones de Pages
No se puede aplicar a los controladores de página. Por ejemplo, el atributo no se puede aplicar a , ni a ningún otro controlador de página. En una aplicación de Razor Pages, considere la posibilidad de usar un controlador MVC de ASP.NET Core para páginas con requisitos de autorización diferentes para distintos controladores. El uso de un controlador cuando se requieren requisitos de autorización diferentes es el enfoque menos complejo que se recomienda.
Si decide no usar un controlador MVC, se pueden usar los dos enfoques siguientes para aplicar la autorización a los métodos de controlador de Pages:
- Use páginas independientes para los controladores de página que requieren una autorización diferente. Mueva el contenido compartido a una o varias vistas parciales. Cuando sea posible, este es el enfoque recomendado.
- Para el contenido que debe compartir una página común, escriba un filtro que realice la autorización como parte de . Este enfoque se muestra en el ejemplo siguiente.
implementa el filtro de autorización:
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;
}
proporciona un atributo a la aplicación:
[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; }
}
El atributo se aplica a los controladores de página. En el ejemplo siguiente, el atributo se establece en el controlador de página:
[TypeFilter(typeof(AuthorizeIndexPageHandlerFilter))]
public class IndexModel : PageModel
{
...
[AuthorizePageHandler]
public void OnPostAuthorized() { ... }
}
Advertencia
El enfoque anterior no:
- Redacta con atributos de autorización aplicados a la página, al modelo de página o de forma global. La redacción de atributos de autorización resulta en que la autenticación y la autorización se ejecutan varias veces cuando tiene uno o más atributos o instancias también aplicados a la página.
- Trabaje junto con el resto del sistema de autenticación y autorización de ASP.NET Core. Compruebe que este enfoque funciona correctamente para la aplicación.
No hay planes para admitir el atributo en controladores de página.