Идентификация ASP.NET: пользовательские RefreshTokens и встроенный AspNetUserTokenC#

Место общения программистов C#
Ответить
Anonymous
 Идентификация ASP.NET: пользовательские RefreshTokens и встроенный AspNetUserToken

Сообщение Anonymous »

В настоящее время я реализую аутентификацию на основе токенов с токенами обновления в своем .NET-приложении. Прямо сейчас у меня есть собственная коллекция RefreshTokens в моем ApplicationUser:
public class ApplicationUser : IdentityUser
{
public virtual ICollection RefreshTokens { get; set; } = new List();
}

Я заметил, что ASP.NET Identity по умолчанию генерирует таблицу AspNetUserTokens. Я здесь изобретаю велосипед? Могу ли я просто использовать методы токенов UserManager (SetAuthenticationTokenAsync/GetAuthenticationTokenAsync) вместо управления собственной службой токенов? Нужно ли мне реализовывать собственный TokenProvider?
public async Task LoginAsync(LoginPayload request)
{
var user = await userManager.FindByEmailAsync(request.Username);
if (user == null || !await userManager.CheckPasswordAsync(user, request.Password))
throw new Exception("Invalid email or password");

if(!user.EmailConfirmed)
throw new Exception("Email not confirmed");

var accessToken = tokenService.GenerateAccessToken(user);
var refreshToken = tokenService.GenerateRefreshToken();

user.RefreshTokens.Add(refreshToken);
await context.SaveChangesAsync();

return new LoginResponse(
accessToken,
refreshToken.Token,
(int)(refreshToken.ExpiresAt - DateTimeOffset.UtcNow).TotalMilliseconds,
user.UserName!
);
}

public async Task RefreshTokenAsync(string accessToken, string refreshToken)
{
var principal = tokenService.GetPrincipalFromExpiredToken(accessToken);
if (principal == null)
throw new Exception("Invalid access token");

var user = await userManager.FindByNameAsync(principal.Identity!.Name!);
if (user == null)
throw new Exception("User not found");

var existingToken = await context.RefreshToken
.FirstOrDefaultAsync(rt => rt.Token == refreshToken);
if (existingToken == null || existingToken.ExpiresAt < DateTime.UtcNow)
throw new Exception("Invalid or expired refresh token");

var newAccessToken = tokenService.GenerateAccessToken(user);
var newRefreshToken = tokenService.GenerateRefreshToken();

context.RefreshToken.Remove(existingToken);
user.RefreshTokens.Add(newRefreshToken);
await context.SaveChangesAsync();

return new LoginResponse(
newAccessToken,
newRefreshToken.Token,
(int)(newRefreshToken.ExpiresAt - DateTimeOffset.UtcNow).TotalMilliseconds,
user.UserName!
);
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... tusertoken
Ответить

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

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

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

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

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