Tengo una muestra simple para la autenticación JWT que puede encontrar aquí
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => Como puede ver, he agregado JwtBearerDefaults.AuthenticationScheme al método Authentication dentro de Startup/ConfigureServices Servicios, por lo que debería poder usar el [Authorize] independiente de la siguiente manera
[Authorize] public sealed class WeatherForecastController : BaseController { private static readonly string[] Summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; pero no sé por qué no funciona! (He probado con Postman). Debo definirlo a través de AuthenticationSchemes .
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] public sealed class WeatherForecastController : BaseController { private static readonly string[] Summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; ¿Alguien puede guiarme sobre cómo puedo usar el atributo Authorize de forma independiente sin AuthenticationSchemes , especialmente cuando lo he definido dentro de ConfigureServices ? ¿Qué puse mal?
Tu código no tiene app.UseAuthentication() incluido. Eso significa que no hay un middleware de autenticación.
El esquema de autenticación predeterminado solo lo utiliza el middleware de autenticación para autenticar automáticamente la solicitud y crear el principal actual. Cuando usa [Authorize] solo, los esquemas de autenticación no están configurados y los filtros de autorización no funcionarán. El filtro creado a partir de ese IAuthorizeData ( AuthorizeAttribute es un IAuthorizeData ) es un AuthorizeFilter y esto requiere que los esquemas se establezcan explícitamente.
Es por eso que el otro [Authorize(...)] con algún esquema establecido funciona pero no el [Authorize] .
Por lo tanto, debe usar el middleware de autenticación para usar [Authorize] convenientemente sin tener que especificar los esquemas.
AuthorizeFilter usará IPolicyEvaluator internamente para autenticar la solicitud, aquí está la implementación predeterminada de PolicyEvaluator.AuthenticateAsync : puede ver que verifica la disponibilidad de AuthenticationSchemes .
En .NET 5, puede configurar de la siguiente manera:
Agregue JwtBearerDefaults.AuthenticationScheme como cadena de esquema predeterminada en AddJwtBearer
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, jwt => { jwt.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, .... ; });Usar en Configurar (en caso de usar Rol también)
app.UseAuthentication(); app.UseAuthorization();Y luego puede usar el atributo [Autorizado] como predeterminado
[ApiController] [Route("api/data")] [Authorize] public class DataController : ControllerBaseTambién existe un conflicto entre los métodos AddIdentityCore() y AddIdentity(). Si usa AddIdentity, usa autenticación basada en cookies, por lo que JWT no funciona si no escribe [Authorize (AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] explícitamente. Cambié mi inicio como se muestra a continuación y ahora funciona con [Autorizar] en .Net 6. Estoy usando clases personalizadas tanto para el usuario como para el rol.
services.AddIdentityCore<AppUser>(x => { x.Password.RequireDigit = false; x.Password.RequiredLength = 4; x.Password.RequireLowercase = false; x.Password.RequireNonAlphanumeric = false; x.Password.RequireUppercase = false; }) .AddRoles<AppRole>() .AddEntityFrameworkStores<DBContext>();