使用 IdentityModel/IdentityServer4 验证会话仍然有效

Verifying session still valid with IdentityModel/IdentityServer4

我无法让 IdentityModel 验证令牌是否仍有有效会话。这是我的客户代码。 _httpHttpClient.

的实例

不要因为在这种情况下使用 username/password 来评判我。这是一个受信任的应用程序,我首先从更简单的场景开始,并计划接下来转向混合模型。

var discovery ??= await _http.GetDiscoveryDocumentAsync("http://localhost:5000");
var response = await _http.RequestPasswordTokenAsync(new PasswordTokenRequest
            {
                Address = discovery.TokenEndpoint,
                ClientId = ClientId,
                ClientSecret = ClientSecret,
                Scope = "api1",
                UserName = "test",
                Password = "test"
            }); // This succeeds while returning an AccessToken
var introspectionResponse = await _http.IntrospectTokenAsync(new TokenIntrospectionRequest
            {
                Address = discovery.IntrospectionEndpoint,
                ClientId = ClientId,
                ClientSecret = ClientSecret,
                Token = response.AccessToken
            }); // This fails with an unauthenticated error

我最好的猜测是它一定是参考令牌流。这有点令人困惑。而这里的混淆是 ClientIdClientSecret.

  1. 您在创建 AccessToken 时提供的 ClientIdClientSecret 是最终用户的 ClientIdClientSecret

  2. 您在检查 AccessToken 时提供的 ClientIdClientSecret 应该是您资源的 Name 而它是 Secret不是最终用户 ClientIdClientSecret

IdentityServer 中,内省端点的客户端是 API 或资源,而不是最终用户。阅读完整文档 here.

在你的例子中,将 api1 作为 ClientId 传递,将 api1 的秘密作为 ClientSecret 传递,同时内省 AccessToken。它应该有效。