Контекст
Я поддерживаю провайдера идентификации на основе Identity Server 4 и .NET Core Identity. Мои пользователи используют SPA, где им предлагается войти в систему с использованием неявного потока всякий раз, когда это необходимо (кстати, я знаю, что это больше не рекомендуемый поток для SPA).
Недавно я добавил функцию для отслеживания моментана котором последний токен был выпущен для данного пользователя. Это было легко сделать, добавив экземпляр ICustomAuthorizeRequestValidator
(см. Ниже для упрощенной версии):
public class AuthRequestValidator : ICustomAuthorizeRequestValidator
{
private readonly UserManager<ApplicationUser> _userManager;
public AuthRequestValidator(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
public async Task ValidateAsync(CustomAuthorizeRequestValidationContext context)
{
if (context.Result.IsError)
{
return;
}
var userName = context.Result.ValidatedRequest?.Subject?.Identity?.Name;
var user = await _userManager.FindByNameAsync(userName);
user.LastTokenIssuedUtc = DateTimeOffset.UtcNow;
await _userManager.UpdateAsync(user);
}
}
Вопрос
Теперь я пытаюсь написать интеграционный тест, который проверяет, является лиdatetime обновляется, когда пользователь входит в систему или когда он запрашивает новый токен. В идеале это должно выглядеть следующим образом:
var user = GetUserFromDb("foo@bar.xyz");
var oldLatestToken = user.LastTokenIssuedUtc;
RequestTokenImplicitFlowAsync(new ImplicitFlowRequestParams
{
UserName = "foo@bar.xyz",
Password = "secret",
Scope = "scope"
});
user = GetUserFromDb("foo@bar.xyz");
Assert.True(oldLatestToken < user.LastTokenIssuedUtc);
В приведенном выше примере я использую метод RequestTokenImplicitFlowAsync
и его параметры для иллюстрации своих намерений. К сожалению, такого метода в действительности не существует, и я не смог понять, как я мог бы реализовать его самостоятельно. Это вообще возможно? В других тестах я использую методы расширения, предоставляемые библиотекой IdentityModel , которые поддерживают разные потоки авторизации. Тот факт, что в этой библиотеке ее нет, является сильным намеком на то, что мой нынешний подход, вероятно, неверен.
Есть ли у вас какие-либо предложения о том, как войти в систему с использованием неявного потока из моего интеграционного теста? Или, если это невозможно, не могли бы вы указать другой подход, который я мог бы использовать для достижения цели тестирования моей новой функции?