13

そのため、ID サーバー (ThinkTecture の IdentityServer3 を使用) と MVC6 Web サービス アプリケーションを含む MVC6 アプリがあります。

Web サービス アプリケーションでは、スタートアップで次のコードを使用しています。

app.UseOAuthBearerAuthentication(options =>
{
    options.Authority = "http://localhost:6418/identity";
    options.AutomaticAuthentication = true;
    options.Audience = "http://localhost:6418/identity/resources";
});

Authorize次に、属性を持つアクションを持つコントローラーがあります。

ID サーバーで認証し、提供された JWT トークンを使用して Web サービス アクションにアクセスする JavaScript アプリケーションがあります。

これは機能し、有効なトークンでのみアクションにアクセスできます。

問題は、JWT の有効期限が切れたときに発生します。私が得ているのは、次の例外の例外情報を返す、詳細な ASP.NET 500 エラー ページのように見えるものです。

System.IdentityModel.Tokens.SecurityTokenExpiredException IDX10223: 有効期間の検証に失敗しました。トークンの有効期限が切れています。

私は OAuth と一般的な Web API の保護にかなり慣れていないため、ベースから外れている可能性がありますが、500 エラーは期限切れのトークンには適切ではないようです。これは、Web サービス クライアントにとって決して友好的ではありません。

これは予想される動作ですか? そうでない場合、より適切な応答を得るために何かする必要がありますか?

4

1 に答える 1

11

編集: このバグは ASP.NET Core RC2 で修正されたため、この回答で説明されている回避策は不要になりました。


注: この回避策は、この他のバグにより、ASP.NET 5 RC1では機能しません。RC2 ナイトリー ビルドに移行するか、JWT ベアラー ミドルウェアによってスローされた例外をキャッチして 401 応答を返すカスタム ミドルウェアを作成できます。

app.Use(next => async context => {
    try {
        await next(context);
    }

    catch {
        // If the headers have already been sent, you can't replace the status code.
        // In this case, throw an exception to close the connection.
        if (context.Response.HasStarted) {
            throw;
        }

        context.Response.StatusCode = 401;
    }
});

残念ながら、JWT/OAuth2 ベアラー ミドルウェア (MSFT が管理) は現在、デフォルトでこのように動作していますが、最終的には修正される予定です。詳細については、この GitHub チケットを参照してください: https://github.com/aspnet/Security/issues/411

AuthenticationFailed幸いなことに、通知を使用して「簡単に」回避できます。

app.UseOAuthBearerAuthentication(options => {
    options.Notifications = new OAuthBearerAuthenticationNotifications {
        AuthenticationFailed = notification => {
            notification.HandleResponse();

            return Task.FromResult<object>(null);
        }
    };
});
于 2015-09-02T12:45:05.520 に答える