Я использую IdentityServer4 в ASP.NET Core 2.2.Клиентское приложение (RP) - это API, также приложение ASP.NET Core 2.2.Пользователь входит в систему с использованием потока кода авторизации и получает файл cookie от IdentityServer (idsrv
).Затем они получают код авторизации и токен доступа для API (RP).
Я хочу иметь возможность отменить существующий сеанс входа пользователя и получить доступ к токенам в некоторых случаях, например, если их пароль был сброшен.В IdentityServer я реализовал добавленную собственную схему аутентификации:
.AddCookie("MyAuthenticationScheme", options =>
{
options.SessionStore = new MyTicketStore();
options.EventsType = typeof(MyCookieAuthenticationEvents);
})
Это позволяет мне сделать недействительным сеанс пользователя IdentityServer на сервере до истечения срока действия билета аутентификации.Например, когда пользователь вошел в систему, я добавляю утверждение, в котором хранится дата последнего изменения его пароля, и в MyCookieAuthenticationEvents.ValidatePrincipal()
я проверяю, что он не был изменен с тех пор, как предложено для https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?view=aspnetcore-2.2#react-to-back-end-changes
Iхочу сделать то же самое с токеном доступа, который они используют для доступа к RP.Если пароль пользователя изменился (и в некоторых других случаях), я хочу, чтобы токен доступа был признан недействительным немедленно, а не в ожидании его истечения.Я использую эталонные токены и реализовал IProfileService
и ICustomTokenValidator
.В IProfileService.GetProfileDataAsync
я копирую утверждение о дате изменения пароля в коллекцию утверждений токена доступа, а в ICustomTokenValidator.ValidateAccessTokenAsync
я снова проверяю это утверждение в отношении реального пользователя.
Это работает, но кажется довольно запутанным и сложным, и яИнтересно, есть ли более простой способ сделать это - кажется, что это должно быть общим требованием.