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 to/connect/introspect to the body just _token=<token>
ですが、404を返しました。
本当に理解できなかったと思います。
ASP.NET CoreのIdentity Server 4でイントロスペクションエンドポイントをどのように使用しますか?
IdSvr4の実装は素晴らしいですが、ドキュメントには多くのことが望まれます-実用的なソリューションを考え出すために、インターネットで十分な時間をかけて検索しました。 「仕様を読む」ように言われることは、あなたがコンセプトに不慣れな場合、必ずしも役立つとは限りません。これは、彼らのフォーラムで多く行われていることです。
したがって、_POST /connect/introspect
_に渡す必要があるのはscope secretです。
_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
です(独自の値を使用してください!)-最終的には次のような文字列になります:_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のエンドポイントをイントロスペクションして、その情報を取得できるようになります。
お役に立てば幸いです。
イントロスペクションは通常、着信トークンを検証するためにAPIによって使用されます。また、イントロスペクションエンドポイントでは、仕様ごとの認証が必要です。
APIシークレットをセットアップする必要があります。
https://identityserver4.readthedocs.io/en/latest/reference/api_resource.html
次に、API名/シークレットを使用して、イントロスペクションエンドポイントに対して認証します。基本認証を使用するか、フォームに値を投稿します。
上記の@ジェイの答えは私を大いに助けました。私の場合、コンテンツタイプを RFC 7662 のようにURLエンコードに変更するのを忘れていました。
r.Header.Add("Content-Type", "application/x-www-form-urlencoded")