Auth0 は初めてですか? Auth0 の仕組みをご確認のうえ、OAuth 2.0 フレームワークを使用した API の認証と認可の実装についてお読みください。
はじめに
Microsoft.Owin.Security.Jwt パッケージを使用して、Auth0 を新規または既存の ASP.NET OWIN Web API アプリケーションに統合する方法を説明します。Auth0 の各 API では API Identifier が使用されており、アプリケーションはアクセストークンを検証する際にこれを使用する必要があります。
この例では、次の内容を説明します。
- 受信した HTTP リクエストの
Authorizationヘッダーに JSON Web Token (JWT) が含まれているかどうかを確認する方法。 - Auth0 アカウントの JSON Web Key Set (JWKS) を使用して、トークンが有効かどうかを確認する方法。アクセストークンの検証の詳細については、アクセストークンを検証する を参照してください。
API を作成
Auth0 Dashboard の APIs セクションで、Create API をクリックします。API の名前と識別子を指定します。たとえば、
デフォルトでは、API はトークンの署名アルゴリズムとして RS256 を使用します。RS256 は秘密鍵と公開鍵のキーペアを使用するため、Auth0 アカウントの公開鍵を使用してトークンを検証します。公開鍵は JSON Web Key Set (JWKS) 形式で提供されており、こちら からアクセスできます。
https://quickstarts/api です。後でアクセストークンの検証を設定する際に、この識別子を audience として使用します。Signing Algorithm は RS256 のままにします。
権限を定義する
Permissions では、特定のアクセストークンを使用して、ユーザーに代わってリソースにどのようにアクセスできるかを定義できます。たとえば、ユーザーのアクセスレベルが manager の場合は 
messages リソースへの読み取りアクセスを付与し、administrator の場合はそのリソースへの書き込みアクセスを付与するように設定できます。許可する権限は、Auth0 Dashboard の APIs セクションにある Permissions ビューで定義できます。
この例では、
read:messages スコープを使用します。サンプルプロジェクトを設定する
サンプルコードの
Web.config には appsettings セクションがあり、API で正しい Auth0 ドメイン と API Identifier を使用するよう設定されています。このページからコードをダウンロードした場合は、自動的に入力されます。GitHub の例を使用する場合は、自分で入力する必要があります。web.config
依存関係をインストール
ASP.NET で Auth0 アクセストークンを使用するには、
Microsoft.Owin.Security.Jwt NuGet パッケージで提供される OWIN JWT Middleware を使用します。トークンの署名を検証する
OWIN JWT ミドルウェアはデフォルトで Open ID Connect Discovery を使用しないため、カスタムの
IssuerSigningKeyResolver を指定する必要があります。これを行うには、Support/OpenIdConnectSigningKeyResolver.cs ファイルに次の内容を追加します。この種のカスタム リゾルバーは、以前は NuGet 経由で
Auth0.OpenIdConnectSigningKeyResolver パッケージの一部として提供されていました。このパッケージは現在利用できないため、ご自身で用意する必要があります。OpenIdConnectSigningKeyResolver.cs
OpenIdConnectSigningKeyResolver は、OpenID Connect Configuration エンドポイント (/.well-known/openid-configuration) から、RS256 トークンの署名に使用される JSON Web Key Set を自動的にダウンロードします。続いて、以下の JWT 登録コードで示すように、これを使用して Issuer Signing Key を取得できます。JWT認証を設定する
Startup クラスの Configuration メソッドに移動し、構成済みの JwtBearerAuthenticationOptions を渡す UseJwtBearerAuthentication の呼び出しを追加します。JwtBearerAuthenticationOptions では、ValidAudience プロパティに Auth0 API Identifier を、ValidIssuer に Auth0 ドメインの完全なパスを指定する必要があります。また、署名キーを解決するために、OpenIdConnectSigningKeyResolver のインスタンスを使用するように IssuerSigningKeyResolver を構成する必要があります。Startup.cs
スコープを確認する
上記の JWT ミドルウェアは、リクエストに含まれるアクセストークンが有効であることを検証します。ただし、要求されたリソースにアクセスするために、そのトークンに十分な スコープ があるかどうかを確認する仕組みは、まだ含まれていません。
System.Web.Http.AuthorizeAttribute を継承する ScopeAuthorizeAttribute というクラスを作成します。この Authorization Attribute は、Auth0 テナントから発行された scope クレームが存在するかどうかを確認し、存在する場合は、その scope クレームに要求されたスコープが含まれていることを検証します。ScopeAuthorizeAttribute.cs
API エンドポイントを保護
以下に示すルートは、次のリクエストで使用できます。
GET /api/public: 未認証のリクエストで使用可能GET /api/private: 追加のスコープを必要としないアクセストークンを含む認証済みリクエストで使用可能GET /api/private-scoped:read:messagesスコープが付与されたアクセストークンを含む認証済みリクエストで使用可能
[Authorize] 属性を付与するだけで済みます。特定の API エンドポイントを呼び出す際に必要なスコープが含まれていることを確認するには、アクションに ScopeAuthorize 属性を付与し、scope パラメーターに必要な scope の名前を渡してください。ApiController.cs
チェックポイントアプリケーションの設定が完了したら、アプリケーションを実行して、次のことを確認します。
GET /api/publicが未認証のリクエストで利用できること。GET /api/privateが認証済みのリクエストで利用できること。GET /api/private-scopedが、read:messagesスコープを持つアクセストークンを含む認証済みのリクエストで利用できること。
追加リソース
サンプルアプリケーション
このクイックスタートの完全なサンプルアプリケーション
IDプロバイダー
他のIDプロバイダーを設定
多要素認証
多要素認証を有効化
攻撃対策
攻撃対策について詳しく見る
Rules
カスタムロジックでAuth0を拡張
コミュニティフォーラム
Auth0コミュニティでサポートを受ける