web-dev-qa-db-ja.com

IDサーバー4でイントロスペクションエンドポイントを正しく使用する方法

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でイントロスペクションエンドポイントをどのように使用しますか?

18
user1620696

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のエンドポイントをイントロスペクションして、その情報を取得できるようになります。

お役に立てば幸いです。

29
Jay

イントロスペクションは通常、着信トークンを検証するためにAPIによって使用されます。また、イントロスペクションエンドポイントでは、仕様ごとの認証が必要です。

APIシークレットをセットアップする必要があります。

https://identityserver4.readthedocs.io/en/latest/reference/api_resource.html

次に、API名/シークレットを使用して、イントロスペクションエンドポイントに対して認証します。基本認証を使用するか、フォームに値を投稿します。

5
leastprivilege

上記の@ジェイの答えは私を大いに助けました。私の場合、コンテンツタイプを RFC 7662 のようにURLエンコードに変更するのを忘れていました。

r.Header.Add("Content-Type", "application/x-www-form-urlencoded")
0
Mo-Gang