Написание интеграционного теста для неявной аутентификации потока - PullRequest
1 голос
/ 24 октября 2019

Контекст

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

Есть ли у вас какие-либо предложения о том, как войти в систему с использованием неявного потока из моего интеграционного теста? Или, если это невозможно, не могли бы вы указать другой подход, который я мог бы использовать для достижения цели тестирования моей новой функции?

...