--- lang: ja-jp breaks: true --- # 参考資料 > シナリオ:Web API を呼び出すデーモン アプリケーション > https://learn.microsoft.com/ja-jp/azure/active-directory/develop/scenario-daemon-overview ![](https://hackmd.io/_uploads/SkV2Hvi52.png) ## 概要 * リダイレクト URI は不要。 * 非対話型アプリケーションからアクセスする場合は、委任されたアクセス許可ではなく、「アプリケーションのアクセス許可」を設定する必要がある。 * ## Azure Active Directory の設定 * ![](https://hackmd.io/_uploads/S1R6dPw52.png) * WebAPIの「アプリロール」に「アプリケーション」を割り当てる * ![](https://hackmd.io/_uploads/S1omKwv53.png) * ![](https://hackmd.io/_uploads/rJcNtwv53.png) * ![](https://hackmd.io/_uploads/HJYHYPw9h.png) * ![](https://hackmd.io/_uploads/rk-wFwwch.png) * ※上記の設定を行うことで、コンソールアプリ側で「アプリケーションのアクセス許可」を設定できるようになる。 * コンソールアプリを登録する * ![](https://hackmd.io/_uploads/Bkl0KDD52.png) * ![](https://hackmd.io/_uploads/ryqy5Dv93.png) * ![](https://hackmd.io/_uploads/BJQZcPD9h.png) * リダイレクトURIは未指定で良い * ![](https://hackmd.io/_uploads/By_m5vDcn.png) * ![](https://hackmd.io/_uploads/rkrV5PDqh.png) * コンソールアプリにAPIへのアクセス許可を設定する * ![](https://hackmd.io/_uploads/HkUDrdv52.png) * ![](https://hackmd.io/_uploads/B1MurOvq2.png) * ![](https://hackmd.io/_uploads/SJNtrdPcn.png) * ![](https://hackmd.io/_uploads/rJ4cSdD92.png) * ![](https://hackmd.io/_uploads/HJWoHdvc3.png) * ![](https://hackmd.io/_uploads/BJxzJIOvq3.png) * ※WebAPI側の設定で、アプリケーションロールを割り当てると「アプリケーションの許可」が選択できるようになる。 * ![](https://hackmd.io/_uploads/H14xU_D5n.png) * ![](https://hackmd.io/_uploads/ryne8uD5n.png) * ![](https://hackmd.io/_uploads/HJHQIOw92.png) * ![](https://hackmd.io/_uploads/S1ovUuD5n.png) * ![](https://hackmd.io/_uploads/By6iI_v93.png) * コンソールアプリにクライアントシークレットを追加する。 * ![](https://hackmd.io/_uploads/ryskP_Dq3.png) * ![](https://hackmd.io/_uploads/Bksxv_Pc2.png) * ![](https://hackmd.io/_uploads/HJUWDuw93.png) * ![](https://hackmd.io/_uploads/ry0Wvdvqn.png) * ![](https://hackmd.io/_uploads/B1szwdPc3.png) * ![](https://hackmd.io/_uploads/B1bVwdP5n.png) * ## サンプルプログラム `2-Call-OwnApi` で動作を検証する > active-directory-dotnetcore-daemon-v2 /2-Call-OwnApi/ > https://github.com/Azure-Samples/active-directory-dotnetcore-daemon-v2/tree/master/2-Call-OwnApi ### TodoList-WebApi(※WebAPI) #### appsettings.json ```json= { "AzureAd": { "Instance": "https://login.microsoftonline.com/", "ClientId": "WebAPIのアプリケーション (クライアント) ID", "Domain": "[Enter the domain of your tenant, e.g. contoso.onmicrosoft.com]", "TenantId": "WebAPIのディレクトリ (テナント) ID" }, "Logging": { "LogLevel": { "Default": "Warning" } }, "AllowedHosts": "*" } ``` :::info "Domain"は未設定でも動作した。 ::: #### TodoListController.cs ```csharp= ・・・ //[Authorize] // これを以下の`Roles`の設定に変更する必要がある。 [Authorize(Roles = "API.Console")] [Route("api/[controller]")] [ApiController] public class TodoListController : ControllerBase { ・・・ ``` :::warning `[Authorize]`のままだと、以下のように403となる。 ```shell= info: Microsoft.AspNetCore.Hosting.Diagnostics[1] Request starting HTTP/1.1 GET https://localhost:44372/api/TodoList - - info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[2] Successfully validated the token. info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] Authorization failed. These requirements were not met: ScopeOrAppPermissionAuthorizationRequirement:Scope/AppPermission= info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[13] AuthenticationScheme: Bearer was forbidden. info: Microsoft.AspNetCore.Hosting.Diagnostics[2] Request finished HTTP/1.1 GET https://localhost:44372/api/TodoList - - - 403 0 - 976.1829ms ``` ::: :::warning `[Authorize]`を単純にコメントアウトすると、認証が一切働かなくなる。 ::: ### Daemon-Console(※コンソールアプリ) #### appsettings.json ```json= { "Instance": "https://login.microsoftonline.com/{0}", "Tenant": "コンソールアプリのディレクトリ (テナント) ID", "ClientId": "コンソールアプリのアプリケーション (クライアント) ID", "ClientSecret": "コンソールアプリのクライアントシークレットの値", "TodoListBaseAddress": "https://localhost:44372", "TodoListScope": "WebAPIのアプリケーション ID の URI/.default", "Certificate": {} } ``` :::warning "TodoListScope"の末尾は、必ず`/.default`となっている必要がある。 ::: ### 実行結果 ![](https://hackmd.io/_uploads/Syf3XjDq2.png)