Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

456
Views
¿Por qué debo definir JwtBearerDefaults.AuthenticationScheme para mi atributo Autorizar siempre?

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?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

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 .

over 4 years ago · Santiago Trujillo Report

0

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 : ControllerBase
over 4 years ago · Santiago Trujillo Report

0

Tambié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>();
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!