Генерация JWT неверна для доступа клиента RESTC#

Место общения программистов C#
Ответить
Anonymous
 Генерация JWT неверна для доступа клиента REST

Сообщение Anonymous »

Я настроил свое веб-приложение ASP.NET Core 8 на использование токенов JWT для аутентификации.
Вот как оно настроено (все еще в файле start.cs):

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

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.SaveToken = true;
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ClockSkew = TimeSpan.Zero,

ValidAudience = Configuration["Jwt:Audience"],
ValidIssuer = Configuration["Jwt:Issuer"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])),
};
});
Эта конфигурация токена JWT отлично работает при переходе к представлениям с соответствующими контроллерами, украшенными атрибутом Authorize.
Однако это веб-приложение также предоставляет REST API, где мобильный клиент использует токены носителя в заголовке запроса для аутентификации. Эти токены также генерируются приложением в TokenController.
Проблема, с которой я столкнулся, заключается в том, что сгенерированные токены кажутся неправильными. Поскольку содержимое ответа на вызов API представляет собой HTML-код страницы перенаправления, я прихожу к выводу, что аутентификация не удалась.
Вот как генерируются токены:

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

    [AllowAnonymous]
[HttpPost]
public async Task Index(LoginUserUser usr)
{
IActionResult response = Unauthorized();

var user = await userManager.FindByNameAsync(usr.username);

if (user != null && await userManager.CheckPasswordAsync(user, usr.password))
{
var userRoles = await userManager.GetRolesAsync(user);

var authClaims = new List
{
new(ClaimTypes.Name, user.UserName),
new(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
};

foreach (var userRole in userRoles)
{
authClaims.Add(new Claim(ClaimTypes.Role, userRole));
}

var token = CreateToken(authClaims);
var refreshToken = GenerateRefreshToken();

user.RefreshToken = refreshToken;
var refreshTokenValidityInDays = Convert.ToInt32(Configuration["Jwt:RefreshTokenValidityInDays"]);
user.RefreshTokenExpiryTime = DateTime.Now.AddDays(refreshTokenValidityInDays);

await userManager.UpdateAsync(user);

response = Ok(new
{
access_token = new JwtSecurityTokenHandler().WriteToken(token)
});
}

return response;
}

private JwtSecurityToken CreateToken(List authClaims)
{
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

var result = new JwtSecurityToken(
issuer: Configuration["Jwt:Issuer"],
audience: Configuration["Jwt:Issuer"],
claims: authClaims,
expires: DateTime.Now.AddMinutes(1440),
signingCredentials: credentials);

return result;
}
На данный момент я предполагаю, что существует несоответствие между конфигурацией и генерацией токена, но я не смог изолировать проблему или разработать хороший подход к отладке.
Есть мысли?

Подробнее здесь: https://stackoverflow.com/questions/791 ... ent-access
Ответить

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

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

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

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

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