---
# System prepended metadata

title: Microsoft ID プラットフォームを使用して コンソールアプリから Web API を呼び出す Bearer 2023-07-20
tags: [Azure, IAM, Microsoft ID, OpenID Connect, Bearer, C#, Azure Active Directory, Azure AD, Microsoft Entra ID, ASP.NET Core, OAuth 2.0]

---

---
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)
