.NET 디먼 앱은 웹 API를 호출할 수 있습니다. .NET 디먼 앱은 사전 승인된 여러 웹 API를 호출할 수도 있습니다.
토큰을 사용하여 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
는 다음을 노출합니다.
- 웹 API가 리소스에 액세스하는 데 사용되는
AccessToken
. 이 매개 변수는 일반적으로 Base-64로 인코딩된 JWT인 문자열입니다. 클라이언트는 액세스 토큰 내부를 보지 않아야 합니다. 형식은 안정적 상태 유지가 보장되지 않으며 리소스에 대해 암호화할 수 있습니다. 클라이언트의 액세스 토큰 콘텐츠에 따른 코드 작성은 사용자는 오류 및 클라이언트 논리 나누기의 가장 큰 원인 중 하나입니다. 자세한 내용은 액세스 토큰을 참조하세요.
- 사용자에 대한
IdToken
. 이 매개 변수는 인코딩된 JWT입니다. 자세한 내용은 ID 토큰을 참조하세요.
ExpiresOn
은 토큰이 만료되는 날짜와 시간을 알려줍니다.
TenantId
는 사용자가 발견된 테넌트를 포함합니다. Microsoft Entra B2B 시나리오의 게스트 사용자의 경우 테넌트 ID는 고유 테넌트가 아니라 게스트 테넌트입니다.
사용자에 대해 토큰이 전달될 때 AuthenticationResult
에는 이 사용자에 대한 정보도 포함됩니다. 애플리케이션에 대한 토큰이 사용자의 개입이 없이 요청되는 기밀 클라이언트 흐름의 경우 이 사용자 정보는 null입니다.
- 토큰이 발급된
Scopes
.
- 사용자에 대한 고유한 ID.
IAccount
MSAL.NET은 IAccount
인터페이스를 통해 계정의 개념을 정의합니다. 이러한 호환성이 손상되는 변경은 올바른 의미 체계를 제공합니다. 동일한 사용자는 서로 다른 Microsoft Entra 디렉터리에 여러 계정을 가질 수 있습니다. 또한 MSAL.NET은 홈 계정 정보가 제공되므로 게스트 시나리오의 경우 더 나은 정보를 제공합니다.
다음 다이어그램에서는 IAccount
인터페이스의 구조를 보여줍니다.
AccountId
클래스는 다음 표에 나와 있는 속성을 사용하여 특정 테넌트의 계정을 식별합니다.
속성 |
설명 |
TenantId |
계정이 있는 테넌트의 ID인 GUID에 대한 문자열 표현입니다. |
ObjectId |
테넌트에 계정을 소유하고 있는 사용자의 ID인 GUID에 대한 문자열 표현입니다. |
Identifier |
계정의 고유 식별자입니다. Identifier 는 ObjectId 와 TenantId 를 쉼표로 구분하여 연결한 것입니다. Base 64로 인코딩되지 않습니다. |
IAccount
인터페이스는 단일 계정에 대한 정보를 나타냅니다. 동일한 사용자가 다른 테넌트에 있을 수 있습니다. 즉, 사용자가 여러 계정을 가질 수 있습니다. 다음 표에 해당 멤버가 나와 있습니다.
속성 |
설명 |
Username |
UPN(UserPrincipalName) 형식의 표시 가능한 값을 포함하는 문자열(예: john.doe@contoso.com). 이 문자열은 null이 아닌 HomeAccountId 및 HomeAccountId.Identifier와 달리 null일 수 있습니다. 이 속성은 이전 버전의 MSAL.NET에서 IUser 의 DisplayableId 속성을 대체합니다. |
Environment |
이 계정의 ID 공급자를 포함하는 문자열(예: login.microsoftonline.com ). 이 속성은 IUser 의 IdentityProvider 속성을 대체합니다. 단, IdentityProvider 는 클라우드 환경 외에 테넌트에 대한 정보도 가지고 있습니다. 여기서 값은 호스트일 뿐입니다. |
HomeAccountId |
사용자에 대한 홈 계정의 계정 ID. 이 속성은 Microsoft Entra 테넌트 전체에서 사용자를 고유하게 식별합니다. |
토큰을 사용하여 보호된 API 호출
MSAL이 result
에 AuthenticationResult
를 반환한 후 HTTP 인증 헤더에 이를 추가한 다음, 보호되는 웹 API에 액세스하기 위한 호출을 합니다.
httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);
...
디먼 앱의 경우 호출하는 웹 API는 사전 승인을 받아야 합니다. 디먼 앱에는 증분 동의가 없습니다. (사용자 상호 작용이 없습니다.) 테넌트 관리자는 애플리케이션 및 모든 API 권한에 대해 사전에 동의를 제공해야 합니다. 여러 API를 호출하려는 경우 AcquireTokenForClient
를 호출할 때마다 각 리소스에 대한 토큰을 획득합니다. MSAL은 애플리케이션 토큰 캐시를 사용하여 불필요한 서비스 호출을 방지합니다.