web-dev-qa-db-ja.com

「UseAuthentication()」とは正確には何ですか?

ASP.NET Core 2の認証に関する質問があります:正確に何の呼び出しapp.UseAuthentication()ですか?

カスタム認証ロジックを実装できるようにするための基本的な前提条件ですか? seAuthentication の実装と実際のミドルウェア AuthenticationMiddleware の実装を既に見てきましたが、正直なところ、実際に何をしているか、なぜそれを理解していないのか必要になります。

別の言い方をすれば:

呼び出す必要がありますかUseAuthentication()enter image description here

それとも、それは素敵なもので、とにかくカスタム認証を行うことができますか? enter image description here

呼び出すことなくUseAuthentication()でよかった場合、私はまだ AuthenticationMiddleware が実際に何をしているかに興味があります。それで、もしあなたが私のためにそれを説明することができれば、私はとても感謝していると知っていたなら。

23
baumgarb

カスタムミドルウェアを作成する場合(この例のように)、認証ミドルウェアは自分のミドルウェアを認識しないため、AddAuthenticationを呼び出す必要はありません。

そうは言っても、おそらく独自のミドルウェアを作成したくないでしょう。おそらく、ASP.NET認証フレームワークとうまく機能する新しい認証ハンドラーを作成したいでしょう(コントローラーで[Authorize]属性を使用するため) 。

カスタム認証を作成するには、AuthenticationHandlerを継承し、関連するメソッドを実装する専用ハンドラーを作成する必要があります。 githubでの基本認証の例を見ることができます: https://github.com/blowdart/idunno.Authentication が、ここでは簡単ですカスタムハンドラーの要点を表示する例。

public class BasicAuthenticationOptions : AuthenticationSchemeOptions
{
    public BasicAuthenticationOptions()
    {
    }
}

internal class BasicAuthenticationHandler : AuthenticationHandler<BasicAuthenticationOptions>
{
    private const string _Scheme = "MyScheme";

    public BasicAuthenticationHandler(
        IOptionsMonitor<BasicAuthenticationOptions> options,
        ILoggerFactory logger,
        UrlEncoder encoder,
        ISystemClock clock) : base(options, logger, encoder, clock)
    {
    }

    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        string authorizationHeader = Request.Headers["Custom-Auth-Handler"];

        // create a ClaimsPrincipal from your header
        var claims = new[]
        {
            new Claim(ClaimTypes.NameIdentifier, "My Name")
        };

        var claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(claims, Scheme.Name));
        var ticket = new AuthenticationTicket(claimsPrincipal,
            new AuthenticationProperties { IsPersistent = false },
            Scheme.Name
        );

        return AuthenticateResult.Success(ticket);
    }

その後、Startup.csに新しいスキームを登録できます。

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddAuthentication(BasicAuthenticationDefaults.AuthenticationScheme)
        .AddScheme<BasicAuthenticationOptions, BasicAuthenticationHandler>("MyScheme", options => { /* configure options */ })
}
12
Métoule

呼び出す必要があります。

UseAuthentication()は次のように文書化されています:

https://docs.Microsoft.com/en-us/dotnet/api/Microsoft.aspnetcore.builder.authappbuilderextensions.useauthentication?view=aspnetcore-2.

AuthenticationMiddlewareを指定されたIApplicationBuilderに追加し、認証機能を有効にします。

基本的にこれを行います:

IApplicationBuilder AddAuthentication(this IApplicationBuilder app) {

    return app.UseMiddleware<AuthenticationMiddleware>();
}

...そのため、入力の一部と、場合によっては余分なusingインポートが保存されるだけです。

これにより、プロセスのリクエスト処理パイプラインにAuthenticationMiddlewareインスタンスが追加され、この特定のオブジェクトが認証のための配管を追加します。

1
Dai