Autorización con un esquema específico en ASP.NET Core
Para obtener una introducción a los esquemas de autenticación ASP.NET Core, vea Esquema de autenticación.
En algunos escenarios, como las aplicaciones de página única (SPA), es habitual usar varios métodos de autenticación. Por ejemplo, la aplicación puede usar la autenticación basada en para iniciar sesión y la autenticación de cookie portador JWT para las solicitudes de JavaScript. En algunos casos, la aplicación puede tener varias instancias de un controlador de autenticación. Por ejemplo, dos controladores donde uno contiene una identidad básica y otro se crea cuando se desencadena una autenticación cookie multifactor (MFA). Mfa puede desencadenarse porque el usuario solicitó una operación que requiere seguridad adicional. Para obtener más información sobre cómo aplicar MFA cuando un usuario solicita un recurso que requiere MFA, consulte la GitHub de protección de problemas con MFA.
Un esquema de autenticación se denomina cuando el servicio de autenticación se configura durante la autenticación. Por ejemplo:
public void ConfigureServices(IServiceCollection services)
{
// Code omitted for brevity
services.AddAuthentication()
.AddCookie(options => {
options.LoginPath = "/Account/Unauthorized/";
options.AccessDeniedPath = "/Account/Forbidden/";
})
.AddJwtBearer(options => {
options.Audience = "http://localhost:5001/";
options.Authority = "http://localhost:5000/";
});
En el código anterior, se han agregado dos controladores de autenticación: uno para cookie s y otro para bearer.
Nota
Si se especifica el esquema predeterminado, la HttpContext.User propiedad se establece en esa identidad. Si no se desea ese comportamiento, deshabilite mediante la invocación de la forma sin parámetros de AddAuthentication .
Selección del esquema con el atributo Authorize
En el punto de autorización, la aplicación indica el controlador que se va a usar. Seleccione el controlador con el que la aplicación autorizará pasando una lista delimitada por comas de esquemas de autenticación a [Authorize] . El [Authorize] atributo especifica el esquema de autenticación o los esquemas que se usarán independientemente de si se configura un valor predeterminado. Por ejemplo:
[Authorize(AuthenticationSchemes = AuthSchemes)]
public class MixedController : Controller
// Requires the following imports:
// using Microsoft.AspNetCore.Authentication.Cookies;
// using Microsoft.AspNetCore.Authentication.JwtBearer;
private const string AuthSchemes =
CookieAuthenticationDefaults.AuthenticationScheme + "," +
JwtBearerDefaults.AuthenticationScheme;
En el ejemplo anterior, los controladores de portador y se ejecutan y tienen la oportunidad de crear y anexar una identidad cookie para el usuario actual. Al especificar solo un esquema único, se ejecuta el controlador correspondiente.
[Authorize(AuthenticationSchemes =
JwtBearerDefaults.AuthenticationScheme)]
public class MixedController : Controller
En el código anterior, solo se ejecuta el controlador con el esquema "Bearer". Se cookie omiten las identidades basadas en .
Selección del esquema con directivas
Si prefiere especificar los esquemas deseados en ladirectiva , puede establecer la colección al agregar AuthenticationSchemes la directiva:
services.AddAuthorization(options =>
{
options.AddPolicy("Over18", policy =>
{
policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
policy.RequireAuthenticatedUser();
policy.Requirements.Add(new MinimumAgeRequirement());
});
});
En el ejemplo anterior, la directiva "Over18" solo se ejecuta en la identidad creada por el controlador "Bearer". Use la directiva estableciendo la [Authorize] propiedad del Policy atributo:
[Authorize(Policy = "Over18")]
public class RegistrationController : Controller
Uso de varios esquemas de autenticación
Es posible que algunas aplicaciones necesiten admitir varios tipos de autenticación. Por ejemplo, la aplicación podría autenticar a los usuarios desde Azure Active Directory y desde una base de datos de usuarios. Otro ejemplo es una aplicación que autentica a los usuarios desde Servicios de federación de Active Directory (AD FS) y Azure Active Directory B2C. En este caso, la aplicación debe aceptar un token de portador JWT de varios emisores.
Agregue todos los esquemas de autenticación que quiera aceptar. Por ejemplo, el código siguiente de agrega dos esquemas de autenticación de portador Startup.ConfigureServices JWT con emisores diferentes:
public void ConfigureServices(IServiceCollection services)
{
// Code omitted for brevity
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Audience = "https://localhost:5000/";
options.Authority = "https://localhost:5000/identity/";
})
.AddJwtBearer("AzureAD", options =>
{
options.Audience = "https://localhost:5000/";
options.Authority = "https://login.microsoftonline.com/eb971100-6f99-4bdc-8611-1bc8edd7f436/";
});
}
Nota
Solo se registra una autenticación de portador JWT con el esquema de autenticación predeterminado JwtBearerDefaults.AuthenticationScheme . La autenticación adicional debe registrarse con un esquema de autenticación único.
El siguiente paso consiste en actualizar la directiva de autorización predeterminada para aceptar ambos esquemas de autenticación. Por ejemplo:
public void ConfigureServices(IServiceCollection services)
{
// Code omitted for brevity
services.AddAuthorization(options =>
{
var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(
JwtBearerDefaults.AuthenticationScheme,
"AzureAD");
defaultAuthorizationPolicyBuilder =
defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
});
}
Como se invalida la directiva de autorización predeterminada, es posible usar el [Authorize] atributo en los controladores. A continuación, el controlador acepta solicitudes con JWT emitido por el primer o segundo emisor.
Consulte este GitHub sobre el uso de varios esquemas de autenticación.