ASP.NET Core の認証の概要Overview of ASP.NET Core authentication

作成者: Mike RousosBy Mike Rousos

認証は、ユーザーの ID を突き止めるプロセスです。Authentication is the process of determining a user's identity. 認可は、ユーザーがリソースにアクセスできるかどうかを判断するプロセスです。Authorization is the process of determining whether a user has access to a resource. ASP.NET Core では、認証は IAuthenticationService によって処理されます。これは、認証ミドルウェアによって使用されます。In ASP.NET Core, authentication is handled by the IAuthenticationService, which is used by authentication middleware. 認証サービスは、登録済みの認証ハンドラーを使用して、認証関連のアクションを完了します。The authentication service uses registered authentication handlers to complete authentication-related actions. 認証関連のアクションの例を次に示します。Examples of authentication-related actions include:

  • ユーザーを認証する。Authenticating a user.
  • 認証されていないユーザーが制限されたリソースにアクセスしようとしたときに応答する。Responding when an unauthenticated user tries to access a restricted resource.

登録済みの認証ハンドラーとその構成オプションは、"スキーム" と呼ばれます。The registered authentication handlers and their configuration options are called "schemes".

認証方式は Startup.ConfigureServices に認証サービスを登録することによって指定されます。Authentication schemes are specified by registering authentication services in Startup.ConfigureServices:

  • services.AddAuthentication の呼び出しの後にスキーム固有の拡張メソッド (AddJwtBearerAddCookie など) を呼び出すことによって行います。By calling a scheme-specific extension method after a call to services.AddAuthentication (such as AddJwtBearer or AddCookie, for example). これらの拡張メソッドは AuthenticationBuilder.AddScheme を使用してスキームを適切な設定で登録します。These extension methods use AuthenticationBuilder.AddScheme to register schemes with appropriate settings.
  • あまり一般的ではありませんが、AuthenticationBuilder.AddScheme を直接呼び出す方法もあります。Less commonly, by calling AuthenticationBuilder.AddScheme directly.

たとえば、次のコードでは、Cookie と JWT ベアラー認証スキームの認証サービスとハンドラーが登録されます。For example, the following code registers authentication services and handlers for cookie and JWT bearer authentication schemes:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => Configuration.Bind("JwtSettings", options))
    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => Configuration.Bind("CookieSettings", options));

AddAuthentication パラメーター JwtBearerDefaults.AuthenticationScheme は、特定のスキームが要求されていない場合に既定で使用されるスキームの名前です。The AddAuthentication parameter JwtBearerDefaults.AuthenticationScheme is the name of the scheme to use by default when a specific scheme isn't requested.

複数のスキームが使用される場合、認可ポリシー (または認可属性) で、ユーザーの認証時に使用する認証スキーム (複数可) を指定することができます。If multiple schemes are used, authorization policies (or authorization attributes) can specify the authentication scheme (or schemes) they depend on to authenticate the user. 上記の例では、Cookie 認証スキームを使用する場合に名前を指定しています (既定では CookieAuthenticationDefaults.AuthenticationScheme ですが、AddCookie を呼び出すときに別の名前を指定することもできます)。In the example above, the cookie authentication scheme could be used by specifying its name (CookieAuthenticationDefaults.AuthenticationScheme by default, though a different name could be provided when calling AddCookie).

場合によっては、AddAuthentication の呼び出しが、他の拡張メソッドによって自動的に行われます。In some cases, the call to AddAuthentication is automatically made by other extension methods. たとえば、ASP.NET Core の ID を使用する場合、AddAuthentication が内部的に呼び出されます。For example, when using ASP.NET Core Identity, AddAuthentication is called internally.

認証ミドルウェアは、アプリの IApplicationBuilderUseAuthentication 拡張メソッドを呼び出すことによって Startup.Configure に追加されます。The Authentication middleware is added in Startup.Configure by calling the UseAuthentication extension method on the app's IApplicationBuilder. UseAuthentication を呼び出すと、以前に登録された認証スキームを使用するミドルウェアが登録されます。Calling UseAuthentication registers the middleware which uses the previously registered authentication schemes. 認証されているユーザーに依存するすべてのミドルウェアの前に UseAuthentication を呼び出します。Call UseAuthentication before any middleware that depends on users being authenticated. エンドポイント ルーティングを使用する場合は、次のタイミングで UseAuthentication の呼び出しを行う必要があります。When using endpoint routing, the call to UseAuthentication must go:

  • ルート情報が認証の決定に使用できるように、UseRouting の後。After UseRouting, so that route information is available for authentication decisions.
  • エンドポイントにアクセスする前にユーザーが認証されるように、UseEndpoints の前。Before UseEndpoints, so that users are authenticated before accessing the endpoints.

認証の概念Authentication Concepts

認証スキームAuthentication scheme

認証スキームは、次のものに対応する名前です。An authentication scheme is a name which corresponds to:

  • 認証ハンドラー。An authentication handler.
  • ハンドラーの特定のインスタンスを構成するためのオプション。Options for configuring that specific instance of the handler.

スキームは、関連付けられたハンドラーの認証、チャレンジ、禁止動作を参照するためのメカニズムとして役立ちます。Schemes are useful as a mechanism for referring to the authentication, challenge, and forbid behaviors of the associated handler. たとえば、認証ポリシーでは、スキーム名を使用して、ユーザーの認証に使用する認証スキーム (またはスキーム) を指定できます。For example, an authorization policy can use scheme names to specify which authentication scheme (or schemes) should be used to authenticate the user. 認証を構成する場合は、既定の認証スキームを指定するのが一般的です。When configuring authentication, it's common to specify the default authentication scheme. リソースが特定のスキームを要求しない限り、既定のスキームが使用されます。The default scheme is used unless a resource requests a specific scheme. また、次のことも可能です。It's also possible to:

  • 認証、チャレンジ、禁止アクションに使用する別の既定のスキームを指定する。Specify different default schemes to use for authenticate, challenge, and forbid actions.
  • ポリシー スキームを使用して、複数のスキームを 1 つに結合する。Combine multiple schemes into one using policy schemes.

認証ハンドラーAuthentication handler

認証ハンドラーは:An authentication handler:

認証スキームの構成と受信要求コンテキストに基づき、認証ハンドラーは:Based on the authentication scheme's configuration and the incoming request context, authentication handlers:

  • 認証が成功した場合に、ユーザーの ID を表す AuthenticationTicket オブジェクトを構築します。Construct AuthenticationTicket objects representing the user's identity if authentication is successful.
  • 認証に失敗した場合は、'no result' または 'failure' を返します。Return 'no result' or 'failure' if authentication is unsuccessful.
  • ユーザーがリソースにアクセスしようとするときのチャレンジおよび禁止アクションの方法を用意しています。Have methods for challenge and forbid actions for when users attempt to access resources:
    • アクセスが許可されていない (禁止)。They are unauthorized to access (forbid).
    • 認証されていない (チャレンジ)。When they are unauthenticated (challenge).

認証Authenticate

認証スキームの認証アクションは、要求コンテキストに基づいてユーザーの ID を構築する役割を担います。An authentication scheme's authenticate action is responsible for constructing the user's identity based on request context. 認証が成功したかどうかを示す AuthenticateResult を返します。成功した場合は、認証チケットに含まれるユーザーの ID です。It returns an AuthenticateResult indicating whether authentication was successful and, if so, the user's identity in an authentication ticket. 以下を参照してください。HttpContext.AuthenticateAsyncSee HttpContext.AuthenticateAsync. 認証の例を以下に示します。Authenticate examples include:

  • Cookie からユーザーの ID を構築する Cookie 認証スキーム。A cookie authentication scheme constructing the user's identity from cookies.
  • ユーザーの ID を構築するための JWT ベアラー トークンを逆シリアル化し、検証する JWT ベアラー スキーム。A JWT bearer scheme deserializing and validating a JWT bearer token to construct the user's identity.

課題Challenge

認証チャレンジは、認証されていないユーザーが認証を必要とするエンドポイントを要求したときに、認可によって呼び出されます。An authentication challenge is invoked by Authorization when an unauthenticated user requests an endpoint that requires authentication. 認証チャレンジが発行されるのは、匿名ユーザーが制限されたリソースを要求した場合や、ログイン リンクをクリックした場合などです。An authentication challenge is issued, for example, when an anonymous user requests a restricted resource or clicks on a login link. 認可では、指定された認証スキームを使用してチャレンジが呼び出されます。何も指定されていない場合は、既定値が使用されます。Authorization invokes a challenge using the specified authentication scheme(s), or the default if none is specified. 以下を参照してください。HttpContext.ChallengeAsyncSee HttpContext.ChallengeAsync. 認証チャレンジの例を次に示します。Authentication challenge examples include:

  • ログイン ページにユーザーをリダイレクトする Cookie 認証スキーム。A cookie authentication scheme redirecting the user to a login page.
  • www-authenticate: bearer ヘッダーを持つ 401 結果を返す JWT ベアラースキーム。A JWT bearer scheme returning a 401 result with a www-authenticate: bearer header.

チャレンジ アクションでは、要求されたリソースへのアクセスに使用する認証メカニズムがユーザーに通知されます。A challenge action should let the user know what authentication mechanism to use to access the requested resource.

禁止Forbid

認証されたユーザーがアクセスを許可されていないリソースにアクセスしようとすると、認可によって認証スキームの禁止アクションが呼び出されます。An authentication scheme's forbid action is called by Authorization when an authenticated user attempts to access a resource they are not permitted to access. 以下を参照してください。HttpContext.ForbidAsyncSee HttpContext.ForbidAsync. 認証の禁止の例を次に示します。Authentication forbid examples include:

  • アクセスが禁止されていることを示すページにユーザーをリダイレクトする Cookie 認証スキーム。A cookie authentication scheme redirecting the user to a page indicating access was forbidden.
  • 403 結果を返す JWT ベアラースキーム。A JWT bearer scheme returning a 403 result.
  • ユーザーがリソースへのアクセスを要求できるページにリダイレクトするカスタム認証スキーム。A custom authentication scheme redirecting to a page where the user can request access to the resource.

禁止アクションを使用すると、ユーザーは次のことを知ることができます。A forbid action can let the user know:

  • 認証されている。They are authenticated.
  • 要求されたリソースにアクセスすることは許可されていない。They aren't permitted to access the requested resource.

チャレンジと禁止の違いについては、次のリンクを参照してください。See the following links for differences between challenge and forbid:

その他の技術情報Additional resources