Asp.net core 如何正确使用identity server 4的内省端点?
我使用的是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 我想
POST /connect/introspect
Authorization: Basic xxxyyy
token=<token>
并在中配置
app.UseIdentity();
app.UseIdentityServer();
现在我尝试了一个POST-to/connect/introspect-with-body-justtoken=
,但它返回了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")