1

私は今週末、Identity Server 4 を使い始めました。ほとんどの場合、その使いやすさに感銘を受け、access_token を作成する手順をよく理解できたように感じます。トークンの作成に Implicit-Flow と ResourceOwner-Flow の両方を使用しています。

私の問題は、identityserver3 wep API が作成された JWT を検証できないことです。手動検証に jwt.io を使用している場合にも失敗します。

トークンの例:

eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Iiwia2lkIjoiRkRFQUE5NTBDRjczODM0MzEwNTZBNzY3Mjc1RTNEMzE5N0VERDJGOSIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0NjMzNDM2MjgsImV4cCI6MTQ2MzM0NzIyOCwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwL3Jlc291cmNlcyIsImNsaWVudF9pZCI6ImJyZnBvcnRhbF9hcGkiLCJzY29wZSI6ImJyZnBvcnRhbGJhY2tlbmQiLCJzdWIiOiIyIiwiYXV0aF90aW1lIjoxNDYzMzQzNjI4LCJpZHAiOiJpZHNydiIsInVuaXF1ZV9uYW1lIjoidGVzdCIsImJyZklkIjowLCJhcHROYnIiOiIwIiwiYW1yIjpbInBhc3N3b3JkIl19.iUvP7jVYSZPXozF0htLbaRrl_iqz_JOIczU5WpIoA5RHfgY17YGN4ERm-8NNPvXQBgJDe2ZeCpLV3MJR4smSOx​​NOBlzWWlgGApl5VauE62L0POxUnwzRFt2OYh5MVcilz0hRaKstB02EPXy-rDmgsNY8u_iT0bPU8bDD0XTETPy7QRldSMNKfUmeMOC0y8RQYypmXlZsO89HlseyfqE4kptruAho_EIp61qQ3CchJrkXwSB9YBWz4PrJHAiEA_ntzskOQ7K_96jQYZDH2NxaIQRKz7RPZWQreZHtnM7tUG6PNYI02raUFF7w8SQFTjjKUBQROcPezKZMtgFiv-c2Ww

私が見る1つの問題は、私の理解によれば、Web APIがチェックすることです

http://localhost:5000/.well-known/openid-configuration/jwks

公開鍵の公開鍵の場合。公開鍵は、「x5c」フィールドで利用できることがわかる限りですが、jwt.io の検証に使用すると機能しません。

"keys": [
  {
    "kty": "RSA",
    "use": "sig",
    "kid": "_eqpUM9zg0MQVqdnJ149MZft0vk",
    "x5t": "_eqpUM9zg0MQVqdnJ149MZft0vk",
    "x5c": [
      "MIIDFTCC..."
    ]
  }
]

FDEAA950CF7383431056A767275E3D3197EDD2F9

私の証明書の拇印です。これは、私の JWT の「子供」フィールドと同じです。しかし、jwks 応答の「kid」フィールドが同じであってはなりません。

これはアイデンティティサーバーの私のコードです:

クライアント、スコープ、およびユーザーの InMemory 構成で identityserver4 をセットアップします。正しいデータを含むJWTを取得する場合と同様に、これは機能しているようです。

        var certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
        certStore.Open(OpenFlags.ReadOnly);

        var certCollection = certStore.Certificates.Find(
                                   X509FindType.FindByThumbprint,
                                   "FDEAA950CF7383431056A767275E3D3197EDD2F9",
                                   false);

        if (certCollection.Count > 0)
        {
            var cert = certCollection[0];

            var builder = services.AddIdentityServer(options =>
            {
                options.SigningCertificate = cert;
                options.RequireSsl = true;
            });

            builder.AddInMemoryClients(Clients.Get());
            builder.AddInMemoryScopes(Scopes.Get());
            builder.AddInMemoryUsers(Users.Get());
        }

問題がそこにあるとは思わないので、ここでは Clients、Scopes、および Users クラスを追加しません。

IdentityServer3.AccessTokenValidation を使用した Web API のコードは次のとおりです。

        app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
        {
            Authority = "http://localhost:5000",
            RequiredScopes = new[] { "testscope" }
        });

API が ID サーバーにアクセスしていることをログから確認できますが、プロセスの問題を見つけようとしても、「この要求に対して承認が拒否されました」というメッセージが表示され続けます。すべてのリクエストに。

4

0 に答える 0