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

时间:2017-02-09 01:53:29

标签: asp.net-core .net-core openid-connect identityserver4

我正在使用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();

现在我已经尝试了仅仅token=<token>正文的POST / connect / introspect,但它返回了404。

我相信我真的没有得到它。

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

3 个答案:

答案 0 :(得分:19)

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")
                }
            }
        };
    }

现在...
1.确保您的客户具有范围MY_CUSTOM_SCOPE
2.确保在获得持票人令牌时请求范围MY_CUSTOM_SCOPE

现在,按照以下方式创建api资源名称和秘密的Base64编码字符串:

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的内省端点来获取有关它的信息。

希望有所帮助!

答案 1 :(得分:6)

API通常使用内省来验证传入令牌。内省端点还要求按规范进行身份验证。

您需要设置API密码:

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

然后使用api name / secret对内省端点进行身份验证。使用基本身份验证或在表单中发布值。

答案 2 :(得分:0)

@Jay的上述回答对我很有帮助。就我而言,我忘记了根据RFC 7662

将内容类型更改为url编码
r.Header.Add("Content-Type", "application/x-www-form-urlencoded")