使用 IdentityModel/IdentityServer4 验证会话仍然有效
Verifying session still valid with IdentityModel/IdentityServer4
我无法让 IdentityModel 验证令牌是否仍有有效会话。这是我的客户代码。 _http
是 HttpClient
.
的实例
不要因为在这种情况下使用 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
我最好的猜测是它一定是参考令牌流。这有点令人困惑。而这里的混淆是 ClientId
和 ClientSecret
.
您在创建 AccessToken
时提供的 ClientId
和 ClientSecret
是最终用户的 ClientId
和 ClientSecret
。
您在检查 AccessToken
时提供的 ClientId
和 ClientSecret
应该是您资源的 Name
而它是 Secret
,不是最终用户 ClientId
和 ClientSecret
。
在 IdentityServer
中,内省端点的客户端是 API 或资源,而不是最终用户。阅读完整文档 here.
在你的例子中,将 api1
作为 ClientId
传递,将 api1
的秘密作为 ClientSecret
传递,同时内省 AccessToken
。它应该有效。
我无法让 IdentityModel 验证令牌是否仍有有效会话。这是我的客户代码。 _http
是 HttpClient
.
不要因为在这种情况下使用 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
我最好的猜测是它一定是参考令牌流。这有点令人困惑。而这里的混淆是 ClientId
和 ClientSecret
.
您在创建
AccessToken
时提供的ClientId
和ClientSecret
是最终用户的ClientId
和ClientSecret
。您在检查
AccessToken
时提供的ClientId
和ClientSecret
应该是您资源的Name
而它是Secret
,不是最终用户ClientId
和ClientSecret
。
在 IdentityServer
中,内省端点的客户端是 API 或资源,而不是最终用户。阅读完整文档 here.
在你的例子中,将 api1
作为 ClientId
传递,将 api1
的秘密作为 ClientSecret
传递,同时内省 AccessToken
。它应该有效。