环境:
- 支持隐式流的 IdentityServer4实例
- 使用oidc-client-js 的Angular 7 客户端应用程序
- 使用IdentityServer3 Katana 访问令牌验证中间件的 ASP.NET Framework Web API 资源
基本的令牌发行和验证在我们的环境中运行良好。我现在正在尝试启用静默刷新技术(如此处所述)。在启用automaticSilentRenew
和短之后AccessTokenLifetime
,我可以看到在我的浏览器控制台中触发的静默请求,正如我所期望的那样。
我可以看到对 IS4 的 UserInfo 端点的两个后续调用(见下面的屏幕截图)。第一个是 CORS 预检OPTIONS
请求。在我的自定义实现的断点处IProfileService.IsActiveAsync()
,我可以看到这个请求成功地通过了身份验证(通过检查httpContext
)。
public class ProfileService : IProfileService
{
private readonly HttpContext _httpContext;
public ProfileService(IHttpContextAccessor httpContextAccessor)
{
_httpContext = httpContextAccessor.HttpContext;
}
...
public async Task IsActiveAsync(IsActiveContext context)
{
var temp = _httpContext.User; // breakpoint here
// call external API with _httpContext.User info to get isActive
}
}
但是,对 UserInfo 端点的第二个请求 ( GET
) 不会进行身份验证。我的断点IProfileService.IsActiveAsync()
显示没有用户经过身份验证,因此我用于验证用户是否处于活动状态(调用另一个 API)的例程返回 false,它被转换为 401。我可以在失败的GET
请求上看到此标头WWW-Authenticate: error="invalid_token"
。
我尝试指定一个IdentityTokenLifetime
小于AccessTokenLifetime
per this的值,但没有成功。
以下是两个请求的日志:
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 OPTIONS http://localhost:5000/connect/userinfo
Microsoft.AspNetCore.Cors.Infrastructure.CorsService:Information: CORS policy execution successful.
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 8.5635ms 204
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 GET http://localhost:5000/connect/userinfo
Microsoft.AspNetCore.Cors.Infrastructure.CorsService:Information: CORS policy execution successful.
Microsoft.AspNetCore.Cors.Infrastructure.CorsService:Information: CORS policy execution successful.
IdentityServer4.Hosting.IdentityServerMiddleware:Information: Invoking IdentityServer endpoint: IdentityServer4.Endpoints.UserInfoEndpoint for /connect/userinfo
IdentityServer4.Validation.TokenValidator:Error: User marked as not active: f84db3aa-57b8-48e4-9b59-6deee3d288ad
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 94.7189ms 401
问题:
如何GET
在静默刷新期间获取对 UserInfo 端点的请求以进行身份验证HttpContext
?
更新:
添加两个请求的所有标头和生成的浏览器 cookie 的屏幕截图,以调查 @Anders 的答案。