web-dev-qa-db-ja.com

Azure FunctionsでJSON Web Tokens(JWT)を使用する(Active Directoryを使用しない)

誰かがすでにこれを行っていると確信していますが、MicrosoftによるJWTの実装に関するドキュメントはまだ見つかっていません。 JWTライブラリに関するMicrosoftの公式ドキュメントは基本的に空のページです。以下を参照してください。

https://docs.Microsoft.com/en-us/dotnet/framework/security/json-web-token-handler-api-reference

だから、ここに私(そして他の多くの人も)が達成したいと思うものがあります:

Definition:User ID =システムへのログインに使用されるユーザー名またはメールアドレス。

認証:

  1. ユーザーがログインします。ユーザーはWebフォームに入力し、システムは(HTTPS POSTを介して)ユーザーIDとパスワード(ハッシュ)をサーバーに送信して、ユーザーを認証/検証します。

  2. サーバーはユーザーを認証します。ユーザーIDとパスワードは、データベースに保存されている値と照合され、有効でない場合は、無効なログイン応答が呼び出し元に返されます。

  3. JWTトークンを作成します-????ドキュメントはありません!

  4. JWTトークンを呼び出し元に返します-???? -ヘッダーにあると思いますか? JSON経由、確かではない-再び-ドキュメントなし。

以下のコードを考えると、誰もがステップ3と4のコード例を提供できますか?

  [FunctionName( "authenticate" )]
  public static async Task<HttpResponseMessage> Run( [HttpTrigger( AuthorizationLevel.Anonymous, "get", "post", Route = null )]HttpRequestMessage req, TraceWriter log )
  {

   // Step 1 - Get user ID and password from POST data

   /*
   * Step 2 - Verify user ID and password (compare against DB values)
   * If user ID or password is not valid, return Invalid User response
   */

   // Step 3 - Create JWT token - ????

   // Step 4 - Return JWT token - ????

  }

[〜#〜] authorization [〜#〜]

ユーザーが認証され、JWTトークンを持っていると仮定します(JWTトークンはユーザーセッションに保存されていると想定しています。誰かが詳細情報を提供したい場合は、行ってください):

  1. POSTリクエストは、Azure Functionに対して(ユーザーの誕生日の取得など)を行うために行われます。上記で取得したJWTトークンが読み込まれます(POSTデータまたはヘッダー-それは重要ですか?)および関数に必要な他のデータとともに。

  2. JWTトークンが検証されます-????ドキュメントはありません!

  3. JWTトークンが無効な場合、BadRequest応答が関数によって返されます。

  4. JWTトークンが有効な場合、関数は渡されたデータを使用して処理し、応答を発行します。

以下のコードを考えると、誰もがステップ1と2のコード例を提供できますか?

  [FunctionName( "do_something" )]
  public static async Task<HttpResponseMessage> Run( [HttpTrigger( AuthorizationLevel.Anonymous, "get", "post", Route = null )]HttpRequestMessage req, TraceWriter log )
  {

   // Step 1 - Get JWT token (from POST data or headers?)

   // Step 2 - Validate the JWT token - ???

   // Step 3 - If JWT token is not valid, return BadRequest response

   // Step 4 - Process the request and return data as JSON

  }

すべての情報は、私たち(私)がAzure(匿名)関数でJWTを使用して「安全な」REST APIを構築する方法を理解するのに役立ちます。

前もって感謝します。

11
bdcoder

すべての情報は、私たち(私)がAzure(匿名)関数でJWTを使用して「安全な」REST APIを構築する方法を理解するのに役立ちます。

私の理解では、Azure関数コードで関連ライブラリを使用して、JWTトークンを生成/検証できます。ここにいくつかのチュートリアルがあります、あなたはそれらを参照することができます:

C#でJWTトークンを作成および使用

Jwt.Net、.NETのJWT(JSON Web Token)実装

Asp.Net Web ApiのJWT認証

さらに、 App Service Authentication/Authorization を活用して、機能アプリレベルの認証/承認を構成できます。 Function App Settingsに移動し、Platform featuresタブで「NETWORKING> Authentication/Authorization」をクリックします。 App Service認証を有効にし、匿名リクエスト(アクションなし)を許可するを次のように選択します。

enter image description here

ユーザーロギング用の匿名アクセスを使用してHttpTrigger関数を作成し、ユーザーが存在する場合はJWTトークンを返すことができます。保護されたREST APIの場合、以下のコードサンプルに従うことができます。

if(System.Security.Claims.ClaimsPrincipal.Current.Identity.IsAuthenticated)
{
   //TODO: retrieve the username claim
   return req.CreateResponse(HttpStatusCode.OK,(System.Security.Claims.ClaimsPrincipal.Current.Identity as ClaimsIdentity).Claims.Select(c => new { key = c.Type, value = c.Value }),"application/json");
}
else
{
    return req.CreateResponse(HttpStatusCode.Unauthorized,"Access Denied!"); 
}

App Service Authenticationで使用されるJWTトークンを生成するには、 方法:アプリケーションにカスタム認証を使用する と、カスタムAPIコントローラーCustomAuthControllerの下のコードについてのアドリアンホールの本について- カスタム認証 JWTトークンを作成します。

UPDATE:

App Service Authenticationでのカスタム認証アプローチでは、opにEasyAuthが提供する認証/承認を活用するだけです。私はこのアプローチのためにいくつかのテストを行いましたが、私の側でうまくいくことがわかりました。 Op認証のためにユーザー名とパスワードをHttpTriggerに送信できます。その後、HttpTriggerバックエンドはユーザー情報を検証し、 Microsoft.Azure.Mobile.Server.Login =クライアントにApp Service認証トークンを発行するためのパッケージ、クライアントはAuthenticationTokenプロパティからトークンを取得できます。保護されたAPIに対する後続のリクエストは次のようになります。

https://<your-funapp-name>.azurewebsites.net/api/<httpTrigger-functionName>
Header: x-zumo-auth:<AuthenticationToken>

注:

このアプローチでは、関連するHttpTrigger関数が匿名アクセスを許可する必要があり、App Service認証も匿名要求を許可する(アクションなし)を選択する必要があります。そうでない場合、App Service認証と機能レベル認証の両方がリクエストを検証します。保護されたAPIの場合、opはSystem.Security.Claims.ClaimsPrincipal.Current.Identity.IsAuthenticatedチェックを手動で追加する必要があります。

9
Bruce Chen

これを試してください: https://liftcodeplay.com/2017/11/25/validating-auth0-jwt-tokens-in-Azure-functions-aka-how-to-use-auth0-with-Azure-functions / このガイドを使用して正常に機能しました。 nugetのバージョンのために時間がかかりました。

そのガイドを適切に実行し、次のNugetバージョンを使用してください

IdentityModel.Protocols (2.1.4)
IdentityModel.Protocols.OpenIdConenct (2.1.4)
IdentityModel.Tokens.Jwt (5.1.4)

ああ、ガイドはあなたのAPIリンクとしてあなたの聴衆を書くようにあなたに言う、しないでください。不正なエラーが発生します。 APIの名前を書くだけです。 myapi

関数の実行中にSystem.http.formattingがロードされないというエラーが発生した場合は、NET.Sdk.Functionsを再インストールし、.NETFrameworkを使用して復元されるAspNet.WebApi.Clientに関する警告を無視してください。そして、Visual Studioを再起動します。

3
Charles Dickens

あなたが説明しているのは、少し研究をすることで自分でできるはずのことです。特定の質問に対処するには:

JWTトークンを作成します-????ドキュメントはありません!

Bruceから提供されたリンクは、JWTの作成方法の良い例を示しています。 https://www.codeproject.com/Tips/1208535/Create-And-Consume-JWT-Tokens-in-csharp

JWTトークンを呼び出し元に返します-???? -ヘッダーにあると思いますか? JSON経由、確かではない-再び-ドキュメントなし。

基本的に独自のプロトコルを発明しているため、ドキュメントはありません。つまり、それをどのように行うかは、完全にあなたとあなたのアプリケーションの要件次第です。ログインアクションの場合、HTTP応答ペイロードの一部として返すのが理にかなっている場合があります。トークンが有線で保護されたままになるように、HTTPSを使用していることを確認してください。

POSTリクエストは、Azure Functionに対して(ユーザーの誕生日の取得など)を行うために行われます。上記で取得したJWTトークンが読み込まれます(POSTデータまたはヘッダー-それは重要ですか?)および関数に必要な他のデータとともに。

トークンの送信方法は、完全にあなた次第です。ほとんどのプラットフォームはHTTP Authorization要求ヘッダーを使用しますが、必要ない場合は必要ありません。

JWTトークンが検証されます-????ドキュメントはありません!

ValidateTokenJwtSecurityTokenHandlerメソッドを使用します(JwtSecurityTokenHandlerを取得する方法については、前のリンクを参照してください)。こちらのドキュメント: https://msdn.Microsoft.com/en-us/library/dn451155(v = vs.114).aspx .

2
Chris Gillum