5

IS4 ID サンプルに基づいた IdentityServer4 アプリと、IS4.AccessTokenValidation による承認のためにベアラー トークンを使用する API があります。これは、VisualStudio を介して localhost で正常に動作し、Windows 2012 VM に展開して IIS を介してホストされている場合にも機能します。ID サーバーを App Service Web サイトとして Azure にデプロイすると、すべて問題ありません。ただし、API が VM と同じドメインと証明書を使用して App Service としてデプロイされている場合、Authorize 属性を持つメソッド (ポリシーの有無は関係ありません) は常にヘッダー メッセージと共に 401 を返します。

Www-Authenticate: Bearer error="invalid_token", error_description="The signature key was not found"

IdentityServer4 および IdentityServer4.AccessTokenValidation パッケージの最新リリースを含む .NET 4.5.2 を使用しています。また、これらのパッケージの最新版を GitHub から 30/08/16 から変更なしで取得しました。とにかくIS4 Validatorのバグだとは思いませんが、何原因なのかわかりません。助言がありますか?Azure ホストのバグですか?

これをデバッグできるようにしたいのですが、ゼロから再構築しても、このアプリに対してリモート デバッグを機能させることができず、アプリのログには何も表示されません。ASP.NET セキュリティ リポジトリを調べましたが、ログ記録やデバッグ アクセスがなければ、この問題を解決する方法がわかりません。

API 構成は非常に基本的なものです。

    var jwtBearerOptions = new JwtBearerOptions()
        {
            Authority = Configuration["Authentication:IdentityServer:Server"],
            Audience = Configuration["Authentication:IdentityServer:Server"]+"/resources",
            RequireHttpsMetadata = false,

            AutomaticAuthenticate = true,
            AutomaticChallenge = true,
        };
        app.UseJwtBearerAuthentication(jwtBearerOptions);

Identity Server はサンプルから直接取り出したもので、購入した証明書を署名に使用しています。

他の誰かがこの構成を 2 つの Azure App Services として完全に機能させていますか? または、VM がホストする API に送信された同じベアラー トークンが許容される場合、このエラーの原因となる可能性があるもの。

4

1 に答える 1

4

IssuerSigningKeyinを明示的に設定する必要があることが判明しましたTokenValidationParameters。そのため、App Service ストアから証明書を取得し、.xml 経由で追加しJwtBearerOptions.TokenValidationParametersます。したがって、スタートアップ構成は次のようになります。

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        ...
        JwtSecurityTokenHandler.DefaultInboundClaimTypeMap = new Dictionary<string, string>();
        var tokenValidationParameters = new TokenValidationParameters
        {
            // The signing key must match!
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new X509SecurityKey(GetSigningCertificate()),

            // Validate the JWT Issuer (iss) claim
            ValidateIssuer = false,
            //ValidIssuer = "local",

            // Validate the JWT Audience (aud) claim
            ValidateAudience = false,
            //ValidAudience = "ExampleAudience",

            // Validate the token expiry
            ValidateLifetime = true,

            // If you want to allow a certain amount of clock drift, set that here:
            ClockSkew = TimeSpan.Zero
        };
        var jwtBearerOptions = new JwtBearerOptions()
        {
            Authority = Configuration["Authentication:IdentityServer:Server"],
            Audience = Configuration["Authentication:IdentityServer:Server"]+"/resources",
            RequireHttpsMetadata = false,

            AutomaticAuthenticate = true,
            AutomaticChallenge = true,

            TokenValidationParameters = tokenValidationParameters
        };
        app.UseJwtBearerAuthentication(jwtBearerOptions);

        app.UseMvc();
        ...
    }

これが Azure App Service でのみ必要であり、サーバーや開発マシンでは必要でない理由がわかりません。他の誰かがそれを説明できますか?App Service では ValidateIssuerSigningKey のデフォルトを true に、それ以外では false にすることをお勧めします。

于 2016-09-01T15:06:16.590 に答える