我正在使用Identity Server 4而我正在尝试使用内省端点,但仅仅是我没有得到它的文档。
文档只是给出了这个例子
POST /connect/introspect
Authorization: Basic xxxyyy
token=<token>
现在,为什么会有这种基本身份验证,xxxyyy应该是什么?我的意思是,我的应用中没有设置基本身份验证。我在ConfigureServices
:
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?
答案 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")