Вот как оно настроено (все еще в файле 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"])),
};
});
Однако это веб-приложение также предоставляет 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
Мобильная версия