Используя. 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;
}