【发布时间】:2020-02-20 18:31:22
【问题描述】:
上下文
我维护一个基于 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);
}
}
问题
现在我正在尝试编写一个集成测试,以检查用户登录或请求新令牌时是否更新了日期时间。理想情况下,这将如下所示:
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 库提供的扩展方法,它们支持不同的授权流程。它在该库中不存在的事实强烈暗示我当前的方法可能是错误的。
您对如何使用我的集成测试中的隐式流程登录有什么建议吗?或者,如果这不可能,您能否指出一种我可以用来实现测试新功能目标的不同方法?
【问题讨论】:
标签: c# oauth-2.0 integration-testing identityserver4 openid-connect