. NET Core 3 ClaimTypes.Name возвращает ошибку нулевой ссылки на объект - PullRequest
0 голосов
/ 14 июля 2020

Используя. NET Core 3, я установил свой токен JWT следующим образом:

// generate token that is valid for 7 days
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.UTF8.GetBytes(_config["Tokens:Key"]);
var tokenDescriptor = new SecurityTokenDescriptor
{
   Subject = new ClaimsIdentity(new Claim[]
   {
       new Claim(ClaimTypes.Name, user.Id.ToString())
   }),
   Expires = DateTime.UtcNow.AddDays(7),
   SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
   };
  var token = tokenHandler.CreateToken(tokenDescriptor);
  var loggedInUser = _mapper.Map<AuthUserDto>(user);

  // return OK and the bearer JWT token to client if successfully created
  return Ok(new
  {
     token = tokenHandler.WriteToken(token),
     expiration = token.ValidTo,
     loggedInUser
   });

Токены JWT хранятся в локальном хранилище и в моей службе Angular 8, я прохожу получение токен-носитель из хранилища и отправка его вместе с моей службой в api следующим образом:

const httpOptions = {
  headers: new HttpHeaders({
    Authorization: "Bearer " + localStorage.getItem("token")
  })
};



 getData(): Observable<any[]> {
    console.log(httpOptions)
    return this.http.get<any[]>(this.baseUrl, httpOptions);
  }

В моем контроллере api у меня есть метод get, который принимает анонимный и возвращает список объектов. Однако мне нужно проверить каждый объект и посмотреть, был ли это анонимный пользователь, который запросил список, или пользователь, который вошел в систему, чтобы я мог скрыть / отобразить вещи в пользовательском интерфейсе по мере необходимости. Однако моя функция GetUserIdFromToken() выдает объект, не установленный для экземпляра ошибки Object Null Reference.

[AllowAnonymous]
[HttpGet(Name = "GetSubmissionCallsRoute")]
[ProducesResponseType(typeof(SubmissionCall), 200)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> GetSubmissionCalls()
{
   IEnumerable<SubmissionCall> calls;
   calls = await _subCallsRepo.GetSubmissionCallsAsync();

   var callsToReturn = _mapper.Map<IEnumerable<SubmissionCallListDto>>(calls);

   foreach (var returndto in callsToReturn)
   {
      var IdFromToken = GetUserIdFromToken();
      if (IdFromToken == string.Empty)
      {
         returndto.RequestingUserIsResourceOwner = false;
       }

      returndto.RequestingUserIsResourceOwner = CompareUserIdToIdFromToken(returndto.UserId);
   }

  return Ok(callsToReturn);
}




#region COMMON
        private bool CompareUserIdToIdFromToken(string id)
        {
            if (string.IsNullOrEmpty(id)) throw new ArgumentNullException("User Id can't be null or empty");
            if (id != User.FindFirst(ClaimTypes.Name).Value) return false;
            return true;
        }

        private string GetUserIdFromToken()
        {
            return User.FindFirst(ClaimTypes.Name).Value;
        }

1 Ответ

0 голосов
/ 14 июля 2020

[AllowAnonymous] обходит все утверждения авторизации Здесь . Это означает. NET Core не будет вызывать ПО промежуточного слоя авторизации для проверки самого токена JWT, поэтому в HttpContext.User здесь ничего нет. Если вы хотите создать один API, который принимает оба сценария ios Анонимный и Авторизованный, вы должны написать свой собственный Middleware из Filter, чтобы предотвратить эти случаи (найдя любой Authorization Header в HTTP-запросе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...