首页 > 解决方案 > 使用 IdentityModel/IdentityServer4 验证会话仍然有效

问题描述

我无法让 IdentityModel 验证令牌是否仍有有效会话。这是我的客户代码。_http是 的一个实例HttpClient

不要在这种情况下判断我使用用户名/密码。它是一个受信任的应用程序,我首先从更简单的场景开始,然后计划继续使用混合模型。

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

标签: c#.netidentityserver4identitymodel

解决方案


我在这里最好的猜测是它一定是一个参考令牌流。这有点令人困惑。这里的混乱是ClientIdand ClientSecret

  1. 您在创建 时提供的ClientIdand是最终用户的and 。ClientSecretAccessTokenClientIdClientSecret

  2. 您在反省时提供的ClientIdand应该是您的资源的and It's ,而不是最终用户andClientSecretAccessTokenNameSecretClientIdClientSecret

IdentityServer中,自省端点的客户端是 API 或资源,而不是最终用户。在此处阅读完整文档。

在您的情况下,在自省时传递 as 的asapi1ClientIdSecret 。它应该工作。api1ClientSecretAccessToken


推荐阅读