я запускаю проект webApi для задания в колледже, и я пытаюсь выполнить авторизацию при использовании токенов JWT, это моя текущая конфигурация: Это мой файл UsuariosController.cs.
[HttpPost("login", Name = "LoginUsuario")]
public async Task<ActionResult<Usuario>> LoginUsuario(Usuario Usuario)
{
var usuarioEncontrado = await _context.Usuarios.FirstOrDefaultAsync(
u => u.Correo == Usuario.Correo
);
if (!BCrypt.Net.BCrypt.Verify(Usuario.Contrasena, usuarioEncontrado.Contrasena))
{
return BadRequest("Contraseña incorrecta");
}
if (usuarioEncontrado == null)
{
return NotFound();
}
string token = GenerarToken(usuarioEncontrado);
return Ok(token);
}
private string GenerarToken(Usuario usuario)
{
List<Claim> claims = new List<Claim> { new Claim(ClaimTypes.Email, usuario.Correo) };
var key = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(_configuration.GetSection("AppSettings:Token").Value!)
);
var cred = new SigningCredentials(key, SecurityAlgorithms.HmacSha512Signature);
var token = new JwtSecurityToken(
claims: claims,
expires: DateTime.Now.AddHours(1),
signingCredentials: cred
);
var jwt = new JwtSecurityTokenHandler().WriteToken(token);
return jwt;
}
Это мой файл program.cs:
using Backend.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.Swagger;
using System.Text;
using Swashbuckle.AspNetCore.Filters;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<DataContext>(options => options.UseSqlServer(connectionString));
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(options =>
{
options.AddSecurityDefinition(
"oauth2",
new OpenApiSecurityScheme
{
In = ParameterLocation.Header,
Name = "Authorization",
Type = SecuritySchemeType.ApiKey,
}
);
options.OperationFilter<SecurityRequirementsOperationFilter>();
});
//JWT Authentication
builder.Services.AddAuthentication("Bearer").AddJwtBearer();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
// app.UseAuthentication();
app.MapControllers();
app.Run();
И файл appsettings.json, в котором находится мой секретный ключ для генерации токена:
{
"AppSettings": {
"Token": "*G-JaNdRgUkXp2s5v8y/B?E(H+MbPeSh"
},
"ConnectionStrings": {
"DefaultConnection": ""
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
Есть идеи, что мне не хватает?
Я получаю Bearer error="invalid_token", error_description="Ключ подписи не найден" при передаче токена JWT на Postman для доступа к методу HTTP, который имеет свойство авторизации:
[Authorize]
[HttpGet("listaUsuarios", Name = "GetUsuarios")]
public async Task<ActionResult<IEnumerable<Usuario>>> GetUsuarios()
{
return await _context.Usuarios.ToListAsync();
}
Я добавил недостающие функции, и это не сработало, что еще вы можете предложить?





Вы можете обратиться к приведенному ниже коду, чтобы определить аутентификацию JWT:
// ADD JWT Authentication
builder.Services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(o =>
{
o.RequireHttpsMetadata = false;
var key = Encoding.UTF8.GetBytes(builder.Configuration["AppSettings:Token"]);
o.SaveToken = true;
o.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
ValidateAudience = false,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ClockSkew = TimeSpan.Zero,
IssuerSigningKey = new SymmetricSecurityKey(key)
};
});
...
app.UseAuthentication();
app.UseAuthorization();
Благодаря этой отсутствующей конфигурации все заработало!
Привет @Emanuel Rojas Agüero, добро пожаловать :) Если мой ответ поможет вам решить вашу проблему, не могли бы вы принять его в качестве ответа? См.:Как получить доступ к ответу Большое спасибо.
«Я пытаюсь выполнить авторизацию, используя токены JWT». Вы пропустили
app.UseAuthentication(); app.UseAuthorization();.