Явный пользовательский вход / выход из БД с помощью IdentityServer4 - PullRequest
0 голосов
/ 06 октября 2018

Я использую схему с аутентификацией, используя мою БД и сервер идентификации ASP Core.Я также реализовал IResourceOwnerPasswordValidator и IProfileService.Я подключаюсь к серверу с помощью метода tokenClient.RequestResourceOwnerPasswordAsync и не использую MVC

Кажется, все работает должным образом, но я хочу установить свойство IsLoggedIn для моего пользователя и сохранить его в БД, а когда сессия будет закончена, установите еев ложь.

Как лучше всего это сделать?Нигде не нашел ответа.

РЕДАКТИРОВАТЬ

Кроме того, я хочу упомянуть, что я использую клиентскую библиотеку IdentityModel для подключения к IdentityServer, поэтому у меня нет остальных API в моемслучай

1 Ответ

0 голосов
/ 09 октября 2018

Всякий раз, когда запрашивается токен, вызывается конечная точка токена.Вы можете использовать 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 будет хранить содержимое токена в хранилище данных и будет выдавать только уникальный идентификатор дляэтот токен возвращается клиенту.

Если я не ошибаюсь, вы можете ограничить его одним активным токеном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...