如何正确使用身份服务器 4 的自省端点?

Posted

技术标签:

【中文标题】如何正确使用身份服务器 4 的自省端点?【英文标题】:How to correctly use the introspection endpoint with identity server 4? 【发布时间】:2017-06-26 21:14:04 【问题描述】:

我正在使用 Identity Server 4,我正在尝试使用自省端点,但只是通过文档我没有得到它。

文档只是给出了这个例子

POST /connect/introspect
Authorization: Basic xxxyyy

token=<token>

现在,为什么会有这个基本身份验证,应该是什么 xxxyyy?我的意思是,我的应用程序中没有设置基本身份验证。我刚刚在ConfigureServices 中使用 ASP.NET Core 设置了 Identity Server 4,如下所示:

services.AddIdentityServer()
            .AddTemporarySigningCredential()
            .AddInMemoryApiResources(ApiResourceProvider.GetAllResources())
            .AddAspNetIdentity<Usuario>();

Configure

app.UseIdentity();
app.UseIdentityServer();

现在我尝试了一个 POST 到 /connect/introspect 的正文,只是 token=&lt;token&gt;,但它返回了 404。

我相信我真的没听懂。

我们如何在 ASP.NET Core 中将自省端点与 Identity Server 4 一起使用?

【问题讨论】:

您想通过自省端点实现什么目标? 我正在尝试验证令牌的有效性。我的意思是,一个令牌可能已经过期,或者它可能根本不是一个有效的令牌。我希望能够使用它来验证这一点。搜索了一下,我发现内省端点是这样做的方法,但我并没有真正了解它是如何使用的。 【参考方案1】:

IdSvr4 的实现非常棒,但是文档还有很多不足之处 - 我花了一个小时在互联网上搜索,以便能够提出一个可行的解决方案。如果您不熟悉某个概念,被告知“阅读规范”并不总是有帮助 - 这在他们的论坛上经常发生。

所以 - 你必须传递给POST /connect/introspect 的是一个作用域秘密

您可以通过更改 config.cs 类来配置快速入门。如果您已自定义或未使用快速入门,您将需要更新您使用的任何数据存储 - 但这个概念应该(希望)是清晰的。

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

现在,制作一个 Base64 编码的 api 资源名称和密码字符串,如下所示:

Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("0:1", userName, password)));

其中用户名是MyResource,密码是明文hello(obv。使用您自己的值!)- 应该以如下所示的字符串结尾:TXlSZXNvdXJjZTpoZWxsbw==

现在,您可以发布到 IDSvr4...

POST /connect/introspect
Authorization: Basic TXlSZXNvdXJjZTpoZWxsbw==
Accept: application/json
Content-Type: application/x-www-form-urlencoded

token=<YOUR_TOKEN>

因此,只要您的不记名令牌的范围为 MY_CUSTOM_SCOPE(或您最终调用的任何名称) - 您现在应该能够使用 IdSvr 的自省端点来获取有关它的信息。

【讨论】:

我同意。社区还有很多不足之处。我也必须自己解决这个问题。 谢谢你,为我节省了很多时间。这应该被标记为答案。 正如您所说,“阅读规范”远没有您在此处的解释有用 这是不可原谅的,这是无证的。据我所知,规范(RFC 6749 section 2.3.1)实际上描述了一个完全不同的实现(这是可选的)。 IDS4 本身很棒,但那些家伙追逐咨询费用有点太难了。 请注意,如果您使用带有HttpClientIdentityModel 库,您可以在创建客户端对象后调用SetBasicAuthenticationOAuth(scopename, secret),而不是自己进行编码。【参考方案2】:

API 通常使用自省来验证传入的令牌。此外,自省端点需要根据规范进行身份验证。

您需要设置 API 密码:

https://identityserver4.readthedocs.io/en/latest/reference/api_resource.html

然后使用 api 名称/秘密对自省端点进行身份验证。使用基本身份验证或在表单中发布值。

【讨论】:

OP:稍微扩展@leastprivilege 的答案:您希望对字符串"[yourApiName]:[yourApiSecret]" 进行base64 编码,并将其用作Authorization 标头basic 值。【参考方案3】:

@Jay 上面的回答对我帮助很大。在我的情况下,我忘记根据RFC 7662 将内容类型更改为 url 编码,即

r.Header.Add("Content-Type", "application/x-www-form-urlencoded")

【讨论】:

以上是关于如何正确使用身份服务器 4 的自省端点?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Graphql 中删除自省查询的身份验证

访问自省端点,失败:连接被拒绝 kong,keycload,OIDC

如何使用 AWS appsync (GraphQL) 禁用自省查询?

使用 APIRequestFactory 测试基于令牌的身份验证的正确方法是啥?

自省查询在错误的 url 上运行

使用 JWT 身份验证与用户合作的正确方法是啥?