Получить идентификатор пользователя с помощью токена JWT в ASP.NET Boilerplate - PullRequest
0 голосов
/ 08 октября 2019

Я добавил JWT Auth в свой шаблонный проект asp.net.

Я пытаюсь получить идентификацию пользователя (в идеале это Id) по токену

Вот как я пытаюсь это сделать.

[Authorize]
    [HttpGet]
    [ProducesResponseType(typeof(ShowJobDto), (int)System.Net.HttpStatusCode.OK)]
    public async Task<IActionResult> GetJobs(DateTime? from, DateTime? to)
    {
        var identity = (ClaimsIdentity)User.Identity;
        List<ShowJobDto> jobs;
        var query = _jobRepository.GetAllIncluding(x => x.WorkOrder.Quote,
            x => x.WorkOrder.Quote.Property.Addresses,
            x => x.Engineer).Where(x => x.JobStatus != JobStatus.Pending);
        if (from != null && to != null)
        {
            jobs = await query.Where(x => x.JobDate >= from).Where(x => x.JobDate <= to)
                .ProjectTo<ShowJobDto>(ObjectMapper).OrderBy(x => x.TimeFrom).ToListAsync();
            return Ok(jobs);
        }

        jobs = await query.ProjectTo<ShowJobDto>(ObjectMapper).OrderBy(x => x.TimeFrom).ToListAsync();
        return Ok(jobs);
    }

Я почтальон Я передаю жетон на предъявлении, как этот

enter image description here

Но когда я устанавливаю здесь точку останова var identity = (ClaimsIdentity)User.Identity;

У меня ничего нет. Где моя проблема?

1 Ответ

1 голос
/ 08 октября 2019

Я использую следующий подход для авторизации пользователей в одном из моих приложений. Поэтому я уверен, что вы можете внести некоторые изменения в этот код и получить то, что вам нужно:

Сначала вам нужно получить заголовок и снять с него Несущий.

string authHeaderValue = Request.Headers["Authorization"];

Затемвам нужно использовать ClaimsPrincipal для проверки вашего токена, который является частью System.Security.Claims

Это простое представление этого класса:

public ClaimsPrincipal GetClaims(string token)
{
    var handler = new JwtSecurityTokenHandler();
    var validations = new TokenValidationParameters
    {
         ValidateIssuerSigningKey = true,
         IssuerSigningKey = SIGNING_KEY,
         ValidateIssuer = false,
         ValidateAudience = false
    };

    return handler.ValidateToken(token, validations, out var tokenSecure);
}

Обратите внимание, что ValidateToken является частьюSystem.IdentityModel.Tokens.Jwt;

Вот как убрать Несущего с токена

var tokenClaims = GetClaims(authHeaderValue.Substring("Bearer ".Length).Trim());

Затем вы можете искать Идентификацию пользователя или все, что вам нужно в вашем токене:

var userId = tokenClaims.Claims.Where(c => c.Type == ClaimTypes.NameIdentifier).FirstOrDefault().Value;

В моем случае я сохранил userId в NameIdentifier. Так что измените его в соответствии с вашими настройками.

Еще одна вещь. Убедитесь, что ваш токен не просрочен, пока вы тестируете приложение.

Надеюсь, это поможет.

...