如何正确使用身份服务器 4 的内省端点?
How to correctly use the introspection endpoint with identity server 4?
我正在使用 Identity Server 4,我正在尝试使用内省端点,但仅通过文档我没有得到它。
文档只是给出了这个例子
POST /connect/introspect
Authorization: Basic xxxyyy
token=<token>
现在,为什么会有这个基本身份验证,xxxyyy 应该是什么?我的意思是,我的应用程序中没有设置基本身份验证。我刚刚使用 ASP.NET Core 在 ConfigureServices
:
中设置了 Identity Server 4,如下所示
services.AddIdentityServer()
.AddTemporarySigningCredential()
.AddInMemoryApiResources(ApiResourceProvider.GetAllResources())
.AddAspNetIdentity<Usuario>();
并在 Configure
app.UseIdentity();
app.UseIdentityServer();
现在我只尝试 POST 到 /connect/introspect 正文只是 token=<token>
,但它返回了 404。
我相信我真的没看懂
我们如何在 ASP.NET Core 中使用 Identity Server 4 的内省端点?
内省通常由 APIs 用来验证传入的令牌。此外,内省端点需要根据规范进行身份验证。
您需要设置一个 API 密码:
https://identityserver4.readthedocs.io/en/latest/reference/api_resource.html
然后使用 api name/secret 对内省端点进行身份验证。使用基本身份验证或在表单中发布值。
IdSvr4 的实现非常棒,但文档还有很多不足之处 - 我花了一个小时在互联网上搜索,以便能够提出一个可行的解决方案。如果您是一个概念的新手,被告知 'read the spec' 并不总是有帮助 - 这在他们的论坛上经常发生。
所以 - 你必须传递给 POST /connect/introspect
的是一个 scope secret.
您可以通过更改 config.cs
class 配置快速入门。如果您自定义了数据存储,或者没有使用快速入门,您将需要更新您使用的任何数据存储 - 但这个概念应该(希望)清楚。
public static IEnumerable<ApiResource> GetApiResources()
{
return new List<ApiResource>
{
new ApiResource("MyResource", "My_Resource_DisplayName")
{
ApiSecrets = new List<Secret>
{
new Secret("hello".Sha256())
},
Scopes=
{
new Scope("MY_CUSTOM_SCOPE")
}
}
};
}
现在...
- 确保您的客户端具有范围
MY_CUSTOM_SCOPE
- 确保您在获取不记名令牌时已请求范围
MY_CUSTOM_SCOPE
。
现在,制作一个 api 资源名称和密码的 Base64 编码字符串,如下所示:
Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}:{1}", userName, password)));
其中用户名是 MyResource
,密码是纯文本 hello
(当然,请使用您自己的值!)- 应该以如下所示的字符串结尾:TXlSZXNvdXJjZTpoZWxsbw==
现在,您可以 post 到 IDSvr4...
POST /connect/introspect
Authorization: Basic TXlSZXNvdXJjZTpoZWxsbw==
Accept: application/json
Content-Type: application/x-www-form-urlencoded
token=<YOUR_TOKEN>
因此,只要您的不记名令牌具有范围 MY_CUSTOM_SCOPE
(或您最终调用它的任何内容)- 您现在应该能够使用 IdSvr 的内省端点来获取有关它的信息。
@Jay 上面的回答对我帮助很大。在我的例子中,我忘记将内容类型更改为 url-encoded 按照 RFC 7662 即
r.Header.Add("Content-Type", "application/x-www-form-urlencoded")
我正在使用 Identity Server 4,我正在尝试使用内省端点,但仅通过文档我没有得到它。
文档只是给出了这个例子
POST /connect/introspect
Authorization: Basic xxxyyy
token=<token>
现在,为什么会有这个基本身份验证,xxxyyy 应该是什么?我的意思是,我的应用程序中没有设置基本身份验证。我刚刚使用 ASP.NET Core 在 ConfigureServices
:
services.AddIdentityServer()
.AddTemporarySigningCredential()
.AddInMemoryApiResources(ApiResourceProvider.GetAllResources())
.AddAspNetIdentity<Usuario>();
并在 Configure
app.UseIdentity();
app.UseIdentityServer();
现在我只尝试 POST 到 /connect/introspect 正文只是 token=<token>
,但它返回了 404。
我相信我真的没看懂
我们如何在 ASP.NET Core 中使用 Identity Server 4 的内省端点?
内省通常由 APIs 用来验证传入的令牌。此外,内省端点需要根据规范进行身份验证。
您需要设置一个 API 密码:
https://identityserver4.readthedocs.io/en/latest/reference/api_resource.html
然后使用 api name/secret 对内省端点进行身份验证。使用基本身份验证或在表单中发布值。
IdSvr4 的实现非常棒,但文档还有很多不足之处 - 我花了一个小时在互联网上搜索,以便能够提出一个可行的解决方案。如果您是一个概念的新手,被告知 'read the spec' 并不总是有帮助 - 这在他们的论坛上经常发生。
所以 - 你必须传递给 POST /connect/introspect
的是一个 scope secret.
您可以通过更改 config.cs
class 配置快速入门。如果您自定义了数据存储,或者没有使用快速入门,您将需要更新您使用的任何数据存储 - 但这个概念应该(希望)清楚。
public static IEnumerable<ApiResource> GetApiResources()
{
return new List<ApiResource>
{
new ApiResource("MyResource", "My_Resource_DisplayName")
{
ApiSecrets = new List<Secret>
{
new Secret("hello".Sha256())
},
Scopes=
{
new Scope("MY_CUSTOM_SCOPE")
}
}
};
}
现在...
- 确保您的客户端具有范围
MY_CUSTOM_SCOPE
- 确保您在获取不记名令牌时已请求范围
MY_CUSTOM_SCOPE
。
现在,制作一个 api 资源名称和密码的 Base64 编码字符串,如下所示:
Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}:{1}", userName, password)));
其中用户名是 MyResource
,密码是纯文本 hello
(当然,请使用您自己的值!)- 应该以如下所示的字符串结尾:TXlSZXNvdXJjZTpoZWxsbw==
现在,您可以 post 到 IDSvr4...
POST /connect/introspect
Authorization: Basic TXlSZXNvdXJjZTpoZWxsbw==
Accept: application/json
Content-Type: application/x-www-form-urlencoded
token=<YOUR_TOKEN>
因此,只要您的不记名令牌具有范围 MY_CUSTOM_SCOPE
(或您最终调用它的任何内容)- 您现在应该能够使用 IdSvr 的内省端点来获取有关它的信息。
@Jay 上面的回答对我帮助很大。在我的例子中,我忘记将内容类型更改为 url-encoded 按照 RFC 7662 即
r.Header.Add("Content-Type", "application/x-www-form-urlencoded")