ASP.NET Core 2.0認証ミドルウェア


89

Core 1.1では、@ blowdartのアドバイスに従い、カスタムミドルウェアを実装しました。

https://stackoverflow.com/a/31465227/29821

それはこのように機能しました:

  1. ミドルウェアが実行されました。リクエストヘッダーからトークンを取得しました。
  2. トークンを検証し、有効な場合、HttpContext.User.AddIdentity();を介して追加された複数のクレームを含むID(ClaimsIdentity)を構築しました。
  3. services.AddAuthorizationを使用するConfigureServicesで、ミドルウェアによって提供される要求を要求するポリシーを追加しました。
  4. コントローラ/アクションでは、[Authorize(Roles = "ミドルウェアが追加した役割")]を使用します。

これは2.0で多少機能しますが、トークンが無効で(上記のステップ2)、クレームが追加されない場合は、「authenticationSchemeが指定されておらず、DefaultChallengeSchemeが見つかりませんでした」というメッセージが表示されます。

だから今私は2.0で変更されたauthを読んでいます:

https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x

ASP.NET Core 2.0で同じことをするための正しい方法は何ですか?本当にカスタム認証を行う例は見当たりません。


それは2つのスキーム言うにもかかわらず、このリンクを試してみたが、それは、uは、認証に率い与えるだろうwildermuth.com/2017/08/19/...
Mithun Pattankar

コードを追加して、見てみましょうか?私はcore2.0でJWTに問題があったことを知っています-スタートアップでJWTを動かすケースでした
Webezine

回答:


193

したがって、この問題を解決しようとする長い一日の後に、コア2.0での新しい単一ミドルウェアセットアップ用にカスタム認証ハンドラーを作成する方法をMicrosoftがどのように求めているのか、ようやくわかりました。

MSDNのドキュメントをいくつか調べたところAuthenticationHandler<TOption>IAuthenticationHandlerインターフェイスを実装するというクラスが見つかりました。

そこから、https://github.com/aspnet/Securityにある既存の認証スキームを含むコードベース全体を見つけました

これらの1つの内部では、MicrosoftがJwtBearer認証スキームを実装する方法を示しています。(https://github.com/aspnet/Security/tree/master/src/Microsoft.AspNetCore.Authentication.JwtBearer

私はそのコードのほとんどを新しいフォルダーにコピーし、に関係するすべてのことをクリアしましたJwtBearer

ではJwtBearerHandlerクラス(拡張AuthenticationHandler<>)、のためのオーバーライドがありますTask<AuthenticateResult> HandleAuthenticateAsync()

カスタムトークンサーバーを介してクレームを設定するための古いミドルウェアを追加しまし200 OK401 Unauthorizedが、トークンが無効でクレームが設定されていない場合に、代わりにを吐き出すだけで、権限に関する問題が発生していました。

Task HandleChallengeAsync(AuthenticationProperties properties)なんらかの理由[Authorize(Roles="")]で、コントローラでアクセス権を設定するために使用されるものをオーバーライドしたことに気付きました

このオーバーライドを削除した後、コードは機能し、401アクセス許可が一致しない場合に正常にスローされました。

このことから、メインお持ち帰りは今カスタムミドルウェアを使用することができないということです、あなたはそれを介して、実装する必要がありAuthenticationHandler<>、あなたが設定する必要がDefaultAuthenticateSchemeDefaultChallengeScheme使用した場合services.AddAuthentication(...)

これがどのように見えるかの例を次に示します。

Startup.cs / ConfigureServices()に以下を追加します:

services.AddAuthentication(options =>
{
    // the scheme name has to match the value we're going to use in AuthenticationBuilder.AddScheme(...)
    options.DefaultAuthenticateScheme = "Custom Scheme";
    options.DefaultChallengeScheme = "Custom Scheme";
})
.AddCustomAuth(o => { });

Startup.cs / Configure()に追加:

app.UseAuthentication();

新しいファイルCustomAuthExtensions.csを作成します。

public static class CustomAuthExtensions
{
    public static AuthenticationBuilder AddCustomAuth(this AuthenticationBuilder builder, Action<CustomAuthOptions> configureOptions)
    {
        return builder.AddScheme<CustomAuthOptions, CustomAuthHandler>("Custom Scheme", "Custom Auth", configureOptions);
    }
}

新しいファイルCustomAuthOptions.csを作成します。

public class CustomAuthOptions: AuthenticationSchemeOptions
{
    public CustomAuthOptions()
    {

    }
}

新しいファイルCustomAuthHandler.csを作成します。

internal class CustomAuthHandler : AuthenticationHandler<CustomAuthOptions>
{
    public CustomAuthHandler(IOptionsMonitor<CustomAuthOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
    {
        // store custom services here...
    }
    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        // build the claims and put them in "Context"; you need to import the Microsoft.AspNetCore.Authentication package
        return AuthenticateResult.NoResult();
    }
}

1
素晴らしい投稿ですが、コードのコンパイルに問題があります。CustomAuthOptionsおよびAuthenticateResultタイプがありません。それらを投稿していただけませんか?
alexb

8
結論をGithubリポジトリのコードで共有してもよろしいですか?
CSharper 2017

2
説明DefaultAuthenticateSchemeして頂けDefaultChallengeSchemeますか?なぜ両方が使われているのか分かりませんか?そしてそれらの違いは何ですか。
Mohammed Noureldin 2017

10
「そこから、github.com / aspnet / Securityにある既存の認証スキームを使用したコードベース全体が見つかりました。」この(非常に優れた)回答に沿って、ASP.NETチームがどのように実行するかを確認してください。いつの日か、MSのコードと実践について質問することになるだろうと思ったことはありませんか?
Marc L.

3
後で来る他の人のために、あなたAuthExtensionMicrosoft.Extensions.DependencyInjection名前空間の中にいる必要があります。:この例を参照してくださいgithub.com/aspnet/Security/blob/rel/2.0.0/src/...
ギャリーポーリー

4

あなたが参照する記事が指摘するように、Core 1.xからCore 2.0へのIdentityにはかなりの変更があります。主な変更は、ミドルウェアアプローチから離れ、依存関係注入を使用してカスタムサービスを構成することです。これにより、より複雑な実装向けにIdentityをカスタマイズする際の柔軟性が大幅に向上します。したがって、上記のミドルウェアアプローチから離れて、サービスに移行したいと考えています。この目標を達成するには、参照記事の移行手順に従ってください。まずapp.UseIdentityapp.UseAuthenticationに置き換えます。 UseIdentity廃止され、将来のバージョンではサポートされなくなります。カスタムクレーム変換を挿入し、クレームに対して承認を実行する方法の完全な例このブログ投稿をご覧ください


12
これをWebAPIアプリで使用する方法の例はありますか?
alexb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.