Всякий раз, когда запрашивается токен, вызывается конечная точка токена.Вы можете использовать ProfileService для подключения к потоку.Вы можете добавить свою собственную версию:
public class ProfileService : IProfileService
{
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var sub = context.Subject.GetSubjectId();
var user = await _userManager.FindByIdAsync(sub);
var principal = await _claimsFactory.CreateAsync(user);
var claims = principal.Claims.Where(claim => context.RequestedClaimTypes.Contains(claim.Type)).ToList();
// Add your code ...
context.IssuedClaims = claims;
}
public async Task IsActiveAsync(IsActiveContext context)
{
var sub = context.Subject.GetSubjectId();
var user = await _userManager.FindByIdAsync(sub);
context.IsActive = user != null;
}
}
Обратите внимание на context.Caller
.Это указывает на используемую конечную точку.Для токена доступа и токена обновления это должно быть ProfileDataCallers.ClaimsProviderAccessToken
.
Не забудьте зарегистрировать службу:
services.AddIdentityServer()
...
.AddProfileService<ProfileService>();
Но конечная точка токена не всегда вызывается,Если вы входите в IdentityServer напрямую, вам нужно добавить код в метод login
.Когда вы используете примеры проектов IdentityServer, у вас будет AccountController в проекте IdentityServer.Добавьте свой код в методе login
после этой строки:
await HttpContext.SignInAsync(user.Id, user.UserName, props);
Таким же образом вы можете изменить статус в методе выхода из системы.
Это подтверждается только тогда, когдапользователю нужен новый токен доступа, но не в том случае, если пользователь действительно вошел в систему после этого.Большинство пользователей, вероятно, никогда не выйдут из системы, и, скорее всего, файл cookie будет уничтожен или просто истечет.
Так что вы можете захотеть установить токен доступа на короткое время жизни, например, 5 минут, и рассмотреть возможность выхода пользователя из системы после 5минут.По истечении срока действия токена доступа пользователю необходимо снова войти в систему (или обновить токен доступа).
Вы можете ограничить токены обновления только одноразовым использованием.Можно также использовать вместо опорных токенов :
При использовании опорных токенов - IdentityServer будет хранить содержимое токена в хранилище данных и будет выдавать только уникальный идентификатор дляэтот токен возвращается клиенту.
Если я не ошибаюсь, вы можете ограничить его одним активным токеном.