.NET デーモン アプリでは、Web API を呼び出すことができます。 .NET デーモン アプリでは、事前承認されたいくつかの Web API を呼び出すこともできます。
Microsoft.Identity.Web では、MSAL.NET の複雑さを抽象化します。 条件付きアクセス エラーの処理、キャッシュなど、MSAL.NET の内部を自動的に処理する上位の API が提供されます。
ダウンストリーム API を呼び出すデーモン アプリの Program.cs を次に示します。
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Identity.Abstractions;
using Microsoft.Identity.Web;
// In the Program.cs, acquire a token for your downstream API
var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
tokenAcquirerFactory.Services.AddDownstreamApi("MyApi",
tokenAcquirerFactory.Configuration.GetSection("MyWebApi"));
var sp = tokenAcquirerFactory.Build();
var api = sp.GetRequiredService<IDownstreamApi>();
var result = await api.GetForAppAsync<IEnumerable<TodoItem>>("MyApi");
Console.WriteLine($"result = {result?.Count()}");
Microsoft Graph を呼び出すデーモン アプリの Program.cs を次に示します。
var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
tokenAcquirerFactory.Services.AddMicrosoftGraph();
var serviceProvider = tokenAcquirerFactory.Build();
try
{
GraphServiceClient graphServiceClient = serviceProvider.GetRequiredService<GraphServiceClient>();
var users = await graphServiceClient.Users
.GetAsync(r => r.Options.WithAppOnly());
Console.WriteLine($"{users.Count} users");
Console.ReadKey();
}
catch (Exception ex) { Console.WriteLine("We could not retrieve the user's list: " + $"{ex}"); }
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// Set the appropriate header fields in the request header.
conn.setRequestProperty("Authorization", "Bearer " + accessToken);
conn.setRequestProperty("Accept", "application/json");
String response = HttpClientHelper.getResponseStringFromConn(conn);
int responseCode = conn.getResponseCode();
if(responseCode != HttpURLConnection.HTTP_OK) {
throw new IOException(response);
}
JSONObject responseObject = HttpClientHelper.processResponse(responseCode, response);
Axiosなどの HTTP クライアントを使用し、"承認ベアラー" としてアクセス トークンを使用して API エンドポイント URI を呼び出します。
const axios = require('axios');
async function callApi(endpoint, accessToken) {
const options = {
headers: {
Authorization: `Bearer ${accessToken}`
}
};
console.log('request made to web API at: ' + new Date().toString());
try {
const response = await axios.default.get(endpoint, options);
return response.data;
} catch (error) {
console.log(error)
return error;
}
};
endpoint = "url to the API"
http_headers = {'Authorization': 'Bearer ' + result['access_token'],
'Accept': 'application/json',
'Content-Type': 'application/json'}
data = requests.get(endpoint, headers=http_headers, stream=False).json()
MSAL.NET の AuthenticationResult プロパティ
トークンを取得するメソッドでは、AuthenticationResult
が返されます。 非同期メソッドでは、Task<AuthenticationResult>
が返されます。
MSAL.NET では、AuthenticationResult
は次を公開します。
- Web API がリソースにアクセスするための
AccessToken
。 このパラメーターは、通常は base 64 でエンコードされた JWT の文字列です。 クライアントがアクセス トークン内を見ることはありません。 この形式が変わらないことは保証されておらず、リソース用に暗号化できます。 クライアント上のアクセス トークンのコンテンツに応じてコードを記述することは、エラーとクライアント ロジックの中断を起こす最大の原因の 1 つです。 詳細については、「アクセス トークン」を参照してください。
- ユーザーの
IdToken
。 このパラメーターは、エンコードされた JWT です。 詳細については、ID トークンに関するページを参照してください。
- トークンの有効期限の日時は、
ExpiresOn
から知ることができます。
TenantId
には、ユーザーが存在するテナントが含まれています。 Microsoft Entra B2B のシナリオでのゲスト ユーザーの場合、テナント ID は一意のテナントではなく、ゲスト テナントです。
ユーザーにトークンが配信されるときに、AuthenticationResult
にはこのユーザーに関する情報も含まれます。 アプリケーションのユーザーなしでトークンが要求される機密のクライアント フローの場合、このユーザー情報は null です。
- トークンが発行された
Scopes
。
- ユーザーの一意の ID。
IAccount
MSAL.NET では、IAccount
インターフェイスでアカウントの概念が定義されます。 この破壊的変更により、正しいセマンティクスが得られます。 同じユーザーは、異なる Microsoft Entra ディレクトリに複数のアカウントを持つことができます。 また、MSAL.NET では、ホーム アカウント情報が提供されるので、ゲスト シナリオについてはより詳細な情報が提供されます。
次の図は、IAccount
インターフェイスの構造を示しています。
AccountId
クラスでは、次の表のプロパティで、特定のテナントのアカウントを識別します。
プロパティ |
説明 |
TenantId |
GUID (アカウントが存在するテナントの ID) の文字列表現。 |
ObjectId |
GUID (テナント内でアカウントを所有するユーザーの ID) の文字列表現。 |
Identifier |
アカウントの一意識別子。 Identifier は ObjectId と TenantId をコンマで区切って連結したものです。 base 64 ではエンコードされていません。 |
IAccount
インターフェイスは 1 つのアカウントに関する情報を表します。 同じユーザーが異なるテナントに存在することができます。つまり、1 人のユーザーが複数のアカウントを持つことができます。 そのメンバーは、次の表のとおりです。
プロパティ |
説明 |
Username |
UserPrincipalName (UPN) 形式の表示可能な値の文字列 (例: john.doe@contoso.com)。 null にすることができない HomeAccountId と HomeAccountId.Identifier とは異なり、この文字列は null にできます。 このプロパティは、MSAL.NET の以前のバージョンの IUser の DisplayableId プロパティを置き換えます。 |
Environment |
このアカウントの ID プロバイダーを含む文字列 (例: login.microsoftonline.com )。 IdentityProvider には、クラウド環境に加えテナントに関する情報もありますが、それを除き、このプロパティは、IUser の IdentityProvider プロパティと置き換えることができます。 ここでは値はホストのみです。 |
HomeAccountId |
ユーザーのホーム アカウントのアカウント ID。 このプロパティは、Microsoft Entra テナント全体でユーザーを一意に識別します。 |
トークンを使用して保護された API を呼び出す
MSAL によって result
に AuthenticationResult
が返された後、保護された Web API にアクセスする呼び出しを行う前に、これを HTTP Authorization ヘッダーに追加します。
httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);
...
デーモン アプリの場合、呼び出す Web API は事前に承認されている必要があります。 デーモン アプリに対する増分同意はありません。 (ユーザーによる操作はありません)。テナント管理者は、アプリケーションとすべての API アクセス許可に事前に同意する必要があります。 複数の API を呼び出す場合、AcquireTokenForClient
を呼び出すたびに各リソースのトークンを取得します。 MSAL では、不要なサービス呼び出しを回避するために、アプリケーションのトークン キャッシュを使用します。