Проблема с ClaimsPrincipal в веб-API ASP.NET Core 8C#

Место общения программистов C#
Ответить
Anonymous
 Проблема с ClaimsPrincipal в веб-API ASP.NET Core 8

Сообщение Anonymous »

Я пытаюсь восстановить пользователя по идентификатору, который должен храниться в утверждении, чтобы идентифицировать пользователя при создании статьи.
У меня проблема в CreateAsync.
Я использую .NET 8.0.

Код: Выделить всё

public async Task CreateAsync(ArticleDto dto, ClaimsPrincipal userPrincipal)
{
var userId = userPrincipal.FindFirst(ClaimTypes.NameIdentifier)?.Value;

if (userId == null)
{
throw new KeyNotFoundException("UserId not found");
}

var user = await _dataContext.Users.FindAsync(userId);

if (user == null)
{
throw new KeyNotFoundException("User not found");
}

var category = await _dataContext.Categories.FindAsync(dto.CategoryId);

if (category == null)
{
throw new KeyNotFoundException("Category not found");
}

var article = new Article
{
Title = dto.Title,
Content = dto.Content,
Category = category,
User = user
};

_dataContext.Add(article);
await _dataContext.SaveChangesAsync();

return article;
}
Полученный идентификатор пользователя имеет значение null.
Вот мой метод входа в систему:

Код: Выделить всё

public async Task LoginAsync(LoginDto loginDto)
{
var user = await dataContext.Users
.Include(u => u.Roles)
.FirstOrDefaultAsync( u => u.Email == loginDto.Email);

if (user == null || !VerifyPassword(loginDto.Password, user.Password))
{
throw new UnauthorizedAccessException("Credentials not valid" );
}

var claims = new List
{
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(JwtRegisteredClaimNames.Email, user!.Email),
new Claim(JwtRegisteredClaimNames.Sub, user!.Email),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
};

user.Roles.ForEach(r => claims.Add(new Claim(ClaimTypes.Role, r.Name)));

var k = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(key));
var signed = new SigningCredentials(k, SecurityAlgorithms.HmacSha256);
var expiration = DateTime.Now.AddMinutes(60);

var token = new JwtSecurityToken(
issuer: issuer,
audience: audience,
claims: claims,
expires: expiration,
signingCredentials: signed
);
return new LoginResponse
{
Token = new JwtSecurityTokenHandler().WriteToken(token),
Email = user.Email,
TokenExpiration = expiration,
UserId = user.Id
};
}
Я использовал Postman для некоторых тестов. Если вы спрашиваете, да, я включил токен. Я не знаю, что делать, я застрял с этой проблемой последние 2 часа.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -8-web-api
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»