如何正确使用身份服务器 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=<token>
,但它返回了 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 本身很棒,但那些家伙追逐咨询费用有点太难了。 请注意,如果您使用带有HttpClient
的IdentityModel
库,您可以在创建客户端对象后调用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 的自省端点?的主要内容,如果未能解决你的问题,请参考以下文章
访问自省端点,失败:连接被拒绝 kong,keycload,OIDC
如何使用 AWS appsync (GraphQL) 禁用自省查询?