Проблемы с настройкой аутентификации носителя JWT в ASP.NET CoreC#

Место общения программистов C#
Ответить
Anonymous
 Проблемы с настройкой аутентификации носителя JWT в ASP.NET Core

Сообщение Anonymous »

Я создал минимальное приложение ASP.NET Core, предназначенное для экспериментов с токенами JWT.
Я создал службы для генерации токенов JWT, а также реализовал аутентификацию, требующую этих токенов.
Вот мой стартовый файл Program.cs:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using netwebapi;
using System.Text;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllers();

// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
builder.Services.AddOpenApi();

// Authentication
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.SaveToken = true;
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
ValidateAudience = false,
ValidAudience = builder.Configuration["JWT:ValidAudience"],
ValidIssuer = builder.Configuration["JWT:ValidIssuer"],
ClockSkew = TimeSpan.Zero,
ValidateLifetime = false,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["JWT:Secret"]))
};
});

builder.Services.AddAuthorization();
builder.Services.AddTransient();
builder.Services.AddTransient();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.MapOpenApi();
}

app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();

Токены, генерирующие код:
public class TokenService : ITokenService
{
private readonly IConfiguration _configuration;

public TokenService(IConfiguration configuration)
{
_configuration = configuration;
}

public string GenerateAccessToken(IEnumerable claims)
{
var tokenHandler = new JwtSecurityTokenHandler();

// Create a symmetric security key using the secret key from the configuration.
var authSigningKey = new SymmetricSecurityKey
(Encoding.UTF8.GetBytes(_configuration["JWT:Secret"]));

var tokenDescriptor = new SecurityTokenDescriptor
{
Issuer = _configuration["JWT:ValidIssuer"],
Audience = _configuration["JWT:ValidAudience"],
Subject = new ClaimsIdentity(claims),
Expires = DateTime.Now.AddMinutes(15),
SigningCredentials = new SigningCredentials
(authSigningKey, SecurityAlgorithms.HmacSha256)
};

var token = tokenHandler.CreateToken(tokenDescriptor);

return tokenHandler.WriteToken(token);
}
}

Теперь в конечной точке я могу получить действительные токены, что подтверждаю с помощью jwt.io. У него есть действительные проблемы, аудитория, а также действительная подпись.
Затем я добавляю Authorize к одной из моих конечных точек и добавляю этот заголовок при ее вызове:
Authorization: Bearer ...token...

Я получаю ответ http 401 (неавторизованный).
Конечно, если я удалю аннотацию данных Authorize, все будет работать.
Так почему же это не работает?
Настройки есть, токен кажется действительным (как подтверждено на jwt.io), но я все еще не могу сделать авторизованный запрос.
/>Конечно, для простоты я использовал издателя и аудиторию, заданные для базового URL-адреса приложения, работающего на локальном хосте. Вот часть моих настроек:
"JWT": {
"ValidAudience": "http://localhost:5235",
"ValidIssuer": "http://localhost:5235",
"Secret": "super secret"
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... p-net-core
Ответить

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

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

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

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

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