Токен JWT веб-API Asp.net Core 8 не будет аутентифицироватьсяC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Токен JWT веб-API Asp.net Core 8 не будет аутентифицироваться

Сообщение Anonymous »

У меня есть следующая конечная точка API, которую я хочу защитить с помощью декоратора [Authorize]:

Код: Выделить всё

[Authorize]
[Route("[controller]")]
public class FastaController : Controller
{
[HttpGet()]
public async Task Get(int page = 1, string search = "", int pageSize = 25)
{
// retrieve data here
}
}
При вызове этой конечной точки перед входом кода в метод возвращается 401 Unauthorized.
Параметры JwtTokenSettings моего файла appsettings.json следующие:

Код: Выделить всё

"JwtTokenSettings": {
"Key": "fc746b61cde4f6665d3f9791446cd5395661860c0075a905ed9810b7391af467",
"Issuer": "Comply",
"Audience": "comply",
"ExpiryHours": 24
}
У меня также есть класс настроек конфигурации для JwtTokenSettings, который имеет то же имя, JwtTokenSettings (не показано).
Токен JWT создается вызов GenerateToken из JwtTokenService, который я написал:

Код: Выделить всё

public class JwtTokenService : IJwtTokenService
{
private readonly IOptions jwtTokenSettings;

public JwtTokenService(IOptions jwtTokenSettings)
{
this.jwtTokenSettings = jwtTokenSettings;
}

public string GenerateToken(Guid userId, string userEmail)
{
string secretKey = jwtTokenSettings.Value.Key;
string issuer = jwtTokenSettings.Value.Issuer;
string audience = jwtTokenSettings.Value.Audience;
var expiryHours = jwtTokenSettings.Value.ExpiryHours;

var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, userId.ToString()),
new Claim(JwtRegisteredClaimNames.Email, userEmail),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};

var token = new JwtSecurityToken(
issuer: issuer,
audience: audience,
claims: claims,
expires: DateTime.UtcNow.AddHours(expiryHours),
signingCredentials: credentials
);

return new JwtSecurityTokenHandler().WriteToken(token);
}
}
Наконец, Microsoft JwtService, JwtTokenService и JwtTokenSettings устанавливаются в Program.cs следующим образом:

Код: Выделить всё

var builder = WebApplication.CreateBuilder(args);

builder.Services.Configure(
configuration.GetSection("JwtTokenSettings")
);

var jwtSettings = builder.Configuration.GetSection("JwtTokenSettings");
var key = Encoding.UTF8.GetBytes(jwtSettings["Key"]);

builder.Services.AddSingleton();
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = jwtSettings["Issuer"],
ValidAudience = jwtSettings["Audience"],
IssuerSigningKey = new SymmetricSecurityKey(key)
};
});
Если я удалю декоратор [Authorize] из контроллера, пользователь сможет успешно получить доступ к конечной точке API. Кроме того, пользователя можно правильно идентифицировать, используя следующий код внутри метода Get контроллера (конечная точка).

Код: Выделить всё

var services = this.HttpContext.RequestServices;
var httpContextAccessor = (IHttpContextAccessor)services.GetService(typeof(IHttpContextAccessor));
var userId = httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);

Поэтому, хотя JWTService и «знает», кто пользователи, он не будет их аутентифицировать.
Я надеюсь, что все соответствующие фрагменты находятся здесь. Кто-нибудь может помочь обнаружить проблему? Я ОЧЕНЬ ценю помощь!

Подробнее здесь: https://stackoverflow.com/questions/793 ... thenticate
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Токен JWT веб-API Asp.net Core 8 не будет аутентифицироваться
    Anonymous » » в форуме C#
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Токен JWT веб-API ASP.NET Core 8 не будет аутентифицироваться
    Anonymous » » в форуме C#
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Ошибка Bad Gateway (502) при вызове API Core Core .NET .NET из другого API Core .NET .NET .NET .NET
    Anonymous » » в форуме C#
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Ошибка Bad Gateway (502) при вызове API Core Core .NET .NET из другого API Core .NET .NET .NET .NET
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Токен носителя Jwt недействителен в веб-API ASP.NET Core.
    Anonymous » » в форуме C#
    0 Ответы
    112 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»