Asp.net core 如何正确使用identity server 4的内省端点?

Asp.net core 如何正确使用identity server 4的内省端点?,asp.net-core,.net-core,openid-connect,identityserver4,Asp.net Core,.net Core,Openid Connect,Identityserver4,我使用的是Identity Server 4,我尝试使用内省端点,但仅凭文档我无法获得它 文档只是给出了这个例子 POST /connect/introspect Authorization: Basic xxxyyy token=<token> 并在中配置 app.UseIdentity(); app.UseIdentityServer(); 现在我尝试了一个POST-to/connect/introspect-with-body-justtoken=,但它返回了404 我想

我使用的是Identity Server 4,我尝试使用内省端点,但仅凭文档我无法获得它

文档只是给出了这个例子

POST /connect/introspect
Authorization: Basic xxxyyy

token=<token>
并在
中配置

app.UseIdentity();
app.UseIdentityServer();
现在我尝试了一个POST-to/connect/introspect-with-body-just
token=
,但它返回了404

我想我真的没有明白


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

API通常使用内省来验证传入令牌。此外,内省端点需要按照规范进行身份验证

您需要设置API机密:


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

IdSvr4的实现非常棒,但是文档还有很多需要改进的地方-我花了一个小时在互联网上搜索,以便能够找到一个可行的解决方案。如果你是一个新概念的人,被告知“阅读规范”并不总是有帮助的——这在他们的论坛上经常发生

因此-您必须传递给
POST/connect/introspect
的内容是范围秘密

您可以通过更改
config.cs
类来配置QuickStart。如果您已经定制了数据存储,或者没有使用quickstart,则需要更新您使用的任何数据存储,但概念应该(希望)清楚

public静态IEnumerable GetApiResources()
{
返回新列表
{
新APIROURCE(“我的资源”、“我的资源\u显示名称”)
{
ApiSecrets=新列表
{
新秘密(“hello.Sha256())
},
范围=
{
新范围(“我的自定义范围”)
}
}
};
}
现在

  • 确保您的客户拥有范围
    MY\u CUSTOM\u范围
  • 确保在获取承载令牌时已请求作用域
    MY\u CUSTOM\u作用域
  • 现在,将api资源名称和机密创建一个Base64编码字符串,如下所示:

    Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format(“{0}:{1}”,用户名,密码))

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

    现在,您可以发布到IDSvr4

    POST /connect/introspect
    Authorization: Basic TXlSZXNvdXJjZTpoZWxsbw==
    Accept: application/json
    Content-Type: application/x-www-form-urlencoded
    
    token=<YOUR_TOKEN>
    
    POST/connect/introspect
    授权:基本TXLSZXNVDXJZTPOZWXSBW==
    接受:application/json
    内容类型:application/x-www-form-urlencoded
    代币=
    

    因此,只要您的持票人代币具有作用域
    MY_CUSTOM\u scope
    (或您最终调用它的任何名称),您现在就应该能够使用IdSvr的内省端点来获取有关它的信息。

    @Jay上面的回答对我帮助很大。在我的例子中,我忘记了将内容类型更改为按照I.e


    您试图通过内省端点实现什么?我试图验证令牌的有效性。我的意思是,代币可能已经过期,也可能根本不是有效的代币。我想能够验证这个使用。稍微搜索一下,我发现内省端点是实现这一点的方法,但我并不真正了解它是如何使用的。OP:稍微扩展一下@leastprivilege的回答:您想对字符串进行base64编码
    “[yourApiName]:[yourApiSecret]”
    ,并将其用作
    Authorization
    标题
    basic
    值。我同意。这个社区还有很多不尽如人意的地方。我也得自己解决这个问题。谢谢你,节省了我这么多时间。这应该被标记为答案。正如你所说,“阅读规范”远不如你在这里的解释有用。这是不可原谅的,因为这是没有记录的。据我所知,规范(RFC6749)实际上描述了一个完全不同的实现(这是可选的)。IDS4本身很好,但那些家伙在追逐咨询费用方面有点太难了。请注意,如果您将
    IdentityModel
    库与
    HttpClient
    一起使用,您可以在创建客户端对象后调用
    SetBasicAuthenticationOAuth(scopename,secret)
    POST /connect/introspect
    Authorization: Basic TXlSZXNvdXJjZTpoZWxsbw==
    Accept: application/json
    Content-Type: application/x-www-form-urlencoded
    
    token=<YOUR_TOKEN>
    
    r.Header.Add("Content-Type", "application/x-www-form-urlencoded")