Как получить jwt токен внутри метода с атрибутом AllowAnonymous?
Если для доступа к эндпоинту требуется авторизация через заголовок в котором указывается jwt токен доступа, то я могу спокойно получить его значение и обратиться к Claims где хранится id пользователя
var userId = context.HttpContext.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value; var token = await HttpContext.GetTokenAsync(JwtBearerDefaults.AuthenticationScheme, "access_token") |
var userId = context.HttpContext.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value; var token = await HttpContext.GetTokenAsync(JwtBearerDefaults.AuthenticationScheme, "access_token")
Но в методе с атрибутом AllowAnonymous все будет null
Дополнительно:
А зачем получать id пользователя в методе, не требующем идентификации пользователя?
В качестве refresh-токена чаще всего используется тот же JWT, только в полезной нагрузке у него минимальная информация, достаточная для выдачи новой пары токенов. Обычно это uid токена и id пользователя. Uid используется для проверки, что по данному токену ещё никто не обновлялся.
то я могу спокойно получить его значение и обратиться к Claims где хранится id пользователя
и что вам это дает? если вы не владелец системы... id пользотвалея не дает вам досутпа ни к чему, а еще это может быть открытая информация, например email
Как я поступал в подобной ситуации: на RefreshUrl отправляем модель с AT и RT, плюсом один из клеймов AT - SessionId.
Для разбора AT написан свой хелпер, который создает JwtTokenHandler с настройками, идентичными AddAuthentication, но с отключенной проверкой времени жизни токена.
В данной схеме RT - не JWT, а просто уникальный идентификатор, который при рефреше меняется - чтобы не получить два рабочих AT на сессию.
Как вариант можно сложить все нужные клеймы в RT (тоже JWT), тогда отправлять AT клиенты не должны вовсе, но свой TokenHandler для разбора RT и извлечения клеймов вам все равно понадобится.
Поэтому вам не обязательно получать никакие данные от пользователя, достаточно сам Refresh token, а по нему в базе посмотреть кто его запрашивает и выдать новый JWT. (ИМХО(!))
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для того чтобы получить JWT токен внутри метода с атрибутом AllowAnonymous, вам потребуется использовать библиотеку для работы с JWT токенами в вашем проекте. Например, вы можете воспользоваться библиотекой System.IdentityModel.Tokens.Jwt для работы с JWT токенами в .NET.
Вот пример кода на языке программирования C#, который показывает, как получить JWT токен внутри метода с атрибутом AllowAnonymous:
using System.IdentityModel.Tokens.Jwt; public class AuthController : ControllerBase { [AllowAnonymous] [HttpPost("login")] public IActionResult Login([FromBody] LoginModel model) { // Проверяем учетные данные пользователя if (ValidateUser(model.Username, model.Password)) { // Генерируем JWT токен var token = GenerateJwtToken(model.Username); return Ok(new { token }); } return Unauthorized(); } private string GenerateJwtToken(string username) { var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key_here")); var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( issuer: "your_issuer_here", audience: "your_audience_here", claims: new[] { new Claim(ClaimTypes.Name, username) }, expires: DateTime.Now.AddHours(1), signingCredentials: credentials ); return new JwtSecurityTokenHandler().WriteToken(token); } }
В данном примере метод Login помечен атрибутом AllowAnonymous, что позволяет вызывать его без аутентификации. Внутри метода мы сначала проверяем учетные данные пользователя, а затем генерируем JWT токен с помощью метода GenerateJwtToken. В этом методе мы используем секретный ключ для подписи токена и создаем JWT токен с истекающим сроком действия.
Не забудьте заменить "your_secret_key_here", "your_issuer_here" и "your_audience_here" на ваши собственные значения. Также обратите внимание, что безопасное хранение и обработка секретного ключа крайне важны для защиты ваших JWT токенов.