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);
...
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
PublicClientApplication pca = PublicClientApplication.builder(clientId)
.authority(authority)
.build();
// Acquire a token, acquireTokenHelper would call publicClientApplication's acquireTokenSilently then acquireToken
// see https://github.com/Azure-Samples/ms-identity-java-desktop for a full example
IAuthenticationResult authenticationResult = acquireTokenHelper(pca);
// Set the appropriate header fields in the request header.
conn.setRequestProperty("Authorization", "Bearer " + authenticationResult.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);
iOS および macOS 用の MSAL での Web API の呼び出し
トークンを取得するメソッドは MSALResult
オブジェクトを返します。 MSALResult
により、Web API を呼び出すために使用できる accessToken
プロパティが公開されます。 保護された Web API にアクセスするための呼び出しを行う前に、アクセス トークンを HTTP Authorization ヘッダーに追加してください。
Objective-C:
NSMutableURLRequest *urlRequest = [NSMutableURLRequest new];
urlRequest.URL = [NSURL URLWithString:"https://contoso.api.com"];
urlRequest.HTTPMethod = @"GET";
urlRequest.allHTTPHeaderFields = @{ @"Authorization" : [NSString stringWithFormat:@"Bearer %@", accessToken] };
NSURLSessionDataTask *task =
[[NSURLSession sharedSession] dataTaskWithRequest:urlRequest
completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {}];
[task resume];
Swift:
let urlRequest = NSMutableURLRequest()
urlRequest.url = URL(string: "https://contoso.api.com")!
urlRequest.httpMethod = "GET"
urlRequest.allHTTPHeaderFields = [ "Authorization" : "Bearer \(accessToken)" ]
let task = URLSession.shared.dataTask(with: urlRequest as URLRequest) { (data: Data?, response: URLResponse?, error: Error?) in }
task.resume()
複数の API の呼び出し: 増分同意と条件付きアクセス
同じユーザーに対して複数の API を呼び出すには、最初の API のトークンを取得した後、AcquireTokenSilent
を呼び出します。 その他の API のトークンは、ほとんどの場合、自動的に取得されます。
var result = await app.AcquireTokenXX("scopeApi1")
.ExecuteAsync();
result = await app.AcquireTokenSilent("scopeApi2")
.ExecuteAsync();
対話は、次の場合に必要です。
- ユーザーが最初の API については同意したが、より多くのスコープについて同意する必要が生じた。 この種の同意は、増分同意 と呼ばれます。
- 最初の API は多要素認証を必要としなかったが、次の API は必要とする。
var result = await app.AcquireTokenXX("scopeApi1")
.ExecuteAsync();
try
{
result = await app.AcquireTokenSilent("scopeApi2")
.ExecuteAsync();
}
catch(MsalUiRequiredException ex)
{
result = await app.AcquireTokenInteractive("scopeApi2")
.WithClaims(ex.Claims)
.ExecuteAsync();
}
Axiosなどの HTTP クライアントを使用し、"認可ベアラー" としてアクセス トークンを使用して API エンドポイント URI を呼び出します。
const axios = require('axios');
async function callEndpointWithToken(endpoint, accessToken) {
const options = {
headers: {
Authorization: `Bearer ${accessToken}`
}
};
console.log('Request made at: ' + new Date().toString());
const response = await axios.default.get(endpoint, options);
return response.data;
}
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()