Po utworzeniu obiektu aplikacji klienckiej użyj go do uzyskania tokenu, którego można użyć do wywołania internetowego interfejsu API.
Microsoft.Identity.Web dodaje metody rozszerzenia, które zapewniają wygodne usługi do wywoływania programu Microsoft Graph lub podrzędnego internetowego interfejsu API. Te metody zostały szczegółowo wyjaśnione w aplikacji internetowej, która wywołuje internetowe interfejsy API: wywoływanie interfejsu API. W przypadku tych metod pomocnika nie trzeba ręcznie uzyskiwać tokenu.
Jeśli jednak chcesz ręcznie uzyskać token, poniższy kod przedstawia przykład użycia pliku Microsoft.Identity.Web do tego w kontrolerze macierzystym. Wywołuje program Microsoft Graph przy użyciu interfejsu API REST (zamiast zestawu Microsoft Graph SDK). Zazwyczaj nie musisz pobierać tokenu, musisz utworzyć nagłówek autoryzacji dodany do żądania. Aby uzyskać nagłówek autoryzacji, należy wstrzyknąć usługę IAuthorizationHeaderProvider
przez wstrzykiwanie zależności w konstruktorze kontrolera (lub konstruktorze strony, jeśli używasz platformy Blazor) i używać jej w akcjach kontrolera. Ten interfejs zawiera metody, które tworzą ciąg zawierający protokół (Bearer, Pop, ...) i token. Aby uzyskać nagłówek autoryzacji w celu wywołania interfejsu API w imieniu użytkownika, użyj (CreateAuthorizationHeaderForUserAsync
). Aby uzyskać nagłówek autoryzacji w celu wywołania podrzędnego interfejsu API w imieniu samej aplikacji, w scenariuszu demona użyj (CreateAuthorizationHeaderForAppAsync
).
Metody kontrolera są chronione przez [Authorize]
atrybut, który zapewnia, że tylko uwierzytelnione wywołania mogą używać internetowego interfejsu API.
[Authorize]
public class MyApiController : Controller
{
/// <summary>
/// The web API will accept only tokens 1) for users, 2) that have the `access_as_user` scope for
/// this API.
/// </summary>
static readonly string[] scopeRequiredByApi = new string[] { "access_as_user" };
static readonly string[] scopesToAccessDownstreamApi = new string[] { "api://MyTodolistService/access_as_user" };
readonly IAuthorizationHeaderProvider authorizationHeaderProvider;
public MyApiController(IAuthorizationHeaderProvider authorizationHeaderProvider)
{
this.authorizationHeaderProvider = authorizationHeaderProvider;
}
[RequiredScopes(Scopes = scopesToAccessDownstreamApi)]
public IActionResult Index()
{
// Get an authorization header.
IAuthorizationHeaderProvider authorizationHeaderProvider = this.GetAuthorizationHeaderProvider();
string[] scopes = new string[]{"user.read"};
string authorizationHeader = await authorizationHeaderProvider.CreateAuthorizationHeaderForUserAsync(scopes);
return await callTodoListService(authorizationHeader);
}
}
Aby uzyskać szczegółowe informacje o metodzie callTodoListService
, zobacz Internetowy interfejs API, który wywołuje internetowe interfejsy API: wywoływanie interfejsu API.
Kod ASP.NET jest podobny do kodu pokazanego dla ASP.NET Core:
- Akcja kontrolera chroniona przez atrybut [Autoryzuj] wyodrębnia identyfikator dzierżawy i identyfikator
ClaimsPrincipal
użytkownika członka kontrolera. (ASP.NET używa . HttpContext.User
) Microsoft.Identity.Web.OWIN dodaje metody rozszerzeń do kontrolera, które zapewniają usługi wygodne do wywoływania programu Microsoft Graph lub podrzędnego internetowego interfejsu API, lub uzyskiwania nagłówka autoryzacji, a nawet tokenu. Metody używane do bezpośredniego wywoływania interfejsu API zostały szczegółowo wyjaśnione w artykule Aplikacja internetowa, która wywołuje internetowe interfejsy API: Wywoływanie interfejsu API. W przypadku tych metod pomocnika nie trzeba ręcznie uzyskiwać tokenu.
Jeśli jednak chcesz ręcznie uzyskać token lub skompilować nagłówek autoryzacji, poniższy kod pokazuje, jak używać microsoft.Identity.Web , aby to zrobić w kontrolerze. Wywołuje interfejs API (Microsoft Graph) przy użyciu interfejsu API REST zamiast zestawu Microsoft Graph SDK.
Aby uzyskać nagłówek autoryzacji, należy pobrać usługę IAuthorizationHeaderProvider
z kontrolera przy użyciu metody GetAuthorizationHeaderProvider
rozszerzenia . Aby uzyskać nagłówek autoryzacji w celu wywołania interfejsu API w imieniu użytkownika, użyj (CreateAuthorizationHeaderForUserAsync
). Aby uzyskać nagłówek autoryzacji w celu wywołania podrzędnego interfejsu API w imieniu samej aplikacji, w scenariuszu demona użyj (CreateAuthorizationHeaderForAppAsync
).
Metody kontrolera są chronione przez [Authorize]
atrybut, który gwarantuje, że tylko uwierzytelnieni użytkownicy mogą używać aplikacji internetowej.
Poniższy fragment kodu przedstawia akcję HomeController
elementu , która pobiera nagłówek autoryzacji w celu wywołania programu Microsoft Graph jako interfejsu API REST:
[Authorize]
public class MyApiController : Controller
{
[AuthorizeForScopes(Scopes = new[] { "user.read" })]
public async Task<IActionResult> Profile()
{
// Get an authorization header.
IAuthorizationHeaderProvider authorizationHeaderProvider = this.GetAuthorizationHeaderProvider();
string[] scopes = new string[]{"user.read"};
string authorizationHeader = await authorizationHeaderProvider.CreateAuthorizationHeaderForUserAsync(scopes);
// Use the access token to call a protected web API.
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", authorizationHeader);
string json = await client.GetStringAsync(url);
}
}
Poniższy fragment kodu przedstawia akcję MyApiController
elementu , która pobiera token dostępu w celu wywołania programu Microsoft Graph jako interfejsu API REST:
[Authorize]
public class HomeController : Controller
{
[AuthorizeForScopes(Scopes = new[] { "user.read" })]
public async Task<IActionResult> Profile()
{
// Get an authorization header.
ITokenAcquirer tokenAcquirer = TokenAcquirerFactory.GetDefaultInstance().GetTokenAcquirer();
string[] scopes = new string[]{"user.read"};
string token = await await tokenAcquirer.GetTokenForUserAsync(scopes);
// Use the access token to call a protected web API.
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}");
string json = await client.GetStringAsync(url);
}
}
Oto przykład kodu wywoływanego w akcjach kontrolerów interfejsu API. Wywołuje on podrzędny interfejs API — Microsoft Graph.
@RestController
public class ApiController {
@Autowired
MsalAuthHelper msalAuthHelper;
@RequestMapping("/graphMeApi")
public String graphMeApi() throws MalformedURLException {
String oboAccessToken = msalAuthHelper.getOboToken("https://graph.microsoft.com/.default");
return callMicrosoftGraphMeEndpoint(oboAccessToken);
}
}
Internetowy interfejs API języka Python wymaga użycia oprogramowania pośredniczącego do weryfikowania tokenu elementu nośnego otrzymanego od klienta. Internetowy interfejs API może następnie uzyskać token dostępu dla interfejsu API podrzędnego przy użyciu biblioteki MSAL języka Python, wywołując metodę acquire_token_on_behalf_of
.
Oto przykład kodu, który uzyskuje token dostępu przy użyciu acquire_token_on_behalf_of
metody i platformy Flask. Wywołuje ona podrzędny interfejs API — punkt końcowy subskrypcji usługi Azure Management.
def get(self):
_scopes = ["https://management.azure.com/user_impersonation"]
_azure_management_subscriptions_uri = "https://management.azure.com/subscriptions?api-version=2020-01-01"
current_access_token = request.headers.get("Authorization", None)
#This example only uses the default memory token cache and should not be used for production
msal_client = msal.ConfidentialClientApplication(
client_id=os.environ.get("CLIENT_ID"),
authority=os.environ.get("AUTHORITY"),
client_credential=os.environ.get("CLIENT_SECRET"))
#acquire token on behalf of the user that called this API
arm_resource_access_token = msal_client.acquire_token_on_behalf_of(
user_assertion=current_access_token.split(' ')[1],
scopes=_scopes
)
headers = {'Authorization': arm_resource_access_token['token_type'] + ' ' + arm_resource_access_token['access_token']}
subscriptions_list = req.get(_azure_management_subscriptions_uri), headers=headers).json()
return jsonify(subscriptions_list)
(Zaawansowane) Uzyskiwanie dostępu do pamięci podręcznej tokenów zalogowanego użytkownika z aplikacji w tle, interfejsów API i usług
Możesz użyć implementacji pamięci podręcznej tokenów biblioteki MSAL, aby umożliwić aplikacjom w tle, interfejsom API i usługom korzystanie z pamięci podręcznej tokenu dostępu, aby nadal działać w imieniu użytkowników w ich braku. Jest to szczególnie przydatne, jeśli aplikacje i usługi w tle muszą nadal działać w imieniu użytkownika po wyjściu z aplikacji internetowej frontonu.
Obecnie większość procesów w tle używa uprawnień aplikacji, gdy muszą pracować z danymi użytkownika bez konieczności ich uwierzytelniania lub ponownego uwierzytelniania. Ponieważ uprawnienia aplikacji często wymagają zgody administratora, co wymaga podniesienia uprawnień, napotkano niepotrzebne tarcie, ponieważ deweloper nie zamierzał uzyskać uprawnień wykraczających poza to, na które użytkownik pierwotnie wyraził zgodę dla swojej aplikacji.
Ten przykładowy kod w witrynie GitHub pokazuje, jak uniknąć tego niepotrzebnego tarć, korzystając z pamięci podręcznej tokenów biblioteki MSAL z aplikacji w tle:
Uzyskiwanie dostępu do pamięci podręcznej tokenów zalogowanego użytkownika z aplikacji w tle, interfejsów API i usług