В настоящее время я реализую аутентификацию на основе токенов с токенами обновления в своем .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
Идентификация ASP.NET: пользовательские RefreshTokens и встроенный AspNetUserToken ⇐ C#
Место общения программистов C#
1735906149
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!
);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79326419/asp-net-identity-custom-refreshtokens-vs-built-in-aspnetusertoken[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия