Nachdem Sie ein Clientanwendungsobjekt erstellt haben, verwenden Sie es, um ein Token zu erhalten, mit dem Sie eine Web-API aufrufen können.
Microsoft.Identity.Web fügt Erweiterungsmethoden hinzu, die praktische Dienste zum Aufrufen von Microsoft Graph oder einer nachgeschalteten Web-API bereitstellen. Eine ausführliche Beschreibung dieser Methoden finden Sie unter Web-App, die Web-APIs aufruft: Aufrufen einer Web-API. Mit diesen Hilfsmethoden ist kein manueller Tokenabruf erforderlich.
Wenn Sie jedoch ein Token manuell abrufen möchten, sehen Sie sich den folgenden Code an, der ein Beispiel dafür bietet, wie Sie dies mithilfe von Microsoft.Identity.Web in einem Home-Controller tun können. Microsoft Graph wird mit der REST-API (anstelle des Microsoft Graph SDK) aufgerufen. In der Regel müssen Sie kein Token abrufen, sondern einen Autorisierungsheader erstellen, den Sie Ihrer Anforderung hinzufügen. Zum Abrufen eines Autorisierungsheaders fügen Sie den IAuthorizationHeaderProvider
-Dienst durch eine Abhängigkeitsinjektion in den Konstruktor Ihres Controllers ein (oder in den Seitenkonstruktor, wenn Sie Blazor verwenden) und verwenden ihn in den Controlleraktionen. Diese Schnittstelle verfügt über Methoden, die eine Zeichenfolge erzeugen, die das Protokoll (Bearer, Pop...) und ein Token enthält. Zum Abrufen eines Autorisierungsheaders zum Aufrufen einer API für den Benutzer verwenden Sie (CreateAuthorizationHeaderForUserAsync
). Um einen Autorisierungsheader zu erhalten, um im Namen der Anwendung selbst eine Downstream-API in einem Daemon-Szenario aufzurufen, verwenden Sie (CreateAuthorizationHeaderForAppAsync
).
Die Controllermethoden sind durch ein [Authorize]
-Attribut geschützt, das sicherstellt, dass nur authentifizierte Aufrufe die Web-API verwenden dürfen.
[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);
}
}
Ausführliche Informationen zur callTodoListService
-Methode finden Sie unter Web-API, die Web-APIs aufruft: Aufrufen einer Web-API.
Der Code für ASP.NET ähnelt dem für ASP.NET Core dargestellten Code:
- Eine durch das Attribut „[Authorize]“ geschützte Controlleraktion extrahiert die Mandanten- und Benutzer-ID des
ClaimsPrincipal
-Members aus dem Controller. (ASP.NET verwendet HttpContext.User
.) Microsoft.Identity.Web.OWIN fügt dem Controller Erweiterungsmethoden hinzu, die praktische Dienste zum Aufrufen von Microsoft Graph oder einer Downstream-Web-API oder zum Abrufen eines Autorisierungsheaders oder sogar eines Tokens bereitstellen. Die Methoden zum direkten Aufruf einer API werden ausführlich unter Eine Web-App, die Web-APIs aufruft: Aufrufen einer API beschrieben. Mit diesen Hilfsmethoden ist kein manueller Tokenabruf erforderlich.
Wenn Sie jedoch manuell ein Token abrufen oder einen Autorisierungsheader erstellen möchten, zeigt der folgende Code, wie dies mit Microsoft.Identity.Web in einem Controller möglich ist. Dabei wird eine API (Microsoft Graph) mit der REST-API und nicht mit dem Microsoft Graph SDK aufgerufen.
Zum Abrufen eines Autorisierungsheaders rufen Sie mit einer IAuthorizationHeaderProvider
-Erweiterungsmethode einen GetAuthorizationHeaderProvider
-Dienst vom Controller ab. Zum Abrufen eines Autorisierungsheaders zum Aufrufen einer API für den Benutzer verwenden Sie (CreateAuthorizationHeaderForUserAsync
). Verwenden Sie (CreateAuthorizationHeaderForAppAsync
) zum Abrufen eines Autorisierungsheaders, um eine Downstream-API im Namen der Anwendung selbst in einem Daemon-Szenario aufzurufen.
Die Controllermethoden sind durch ein [Authorize]
-Attribut geschützt, das sicherstellt, dass nur authentifizierte Benutzer die Web-App verwenden dürfen.
Der folgende Codeausschnitt zeigt die Aktion von HomeController
, mit der ein Autorisierungs-Header für einen REST-API-Aufruf von Microsoft Graph abgerufen wird.
[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);
}
}
Der folgende Codeausschnitt zeigt die MyApiController
-Aktion, mit der ein Zugriffstoken zum Aufrufen von Microsoft Graph als REST-API abgerufen wird:
[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);
}
}
Im Folgenden sehen Sie ein Beispiel für den Code, der in den Aktionen der API-Controller aufgerufen wird. Er ruft die Downstream-API (Microsoft Graph) auf.
@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);
}
}
Bei einer Python-Web-API muss das vom Client empfangene Bearertoken mithilfe von Middleware überprüft werden. Die Web-API kann dann das Zugriffstoken für eine Downstream-API unter Verwendung der MSAL Python-Bibliothek durch Aufrufen der Methode acquire_token_on_behalf_of
abrufen.
Im Folgenden finden Sie ein Beispiel für Code, der mithilfe der acquire_token_on_behalf_of
-Methode und des Flask-Frameworks ein Zugriffstoken abruft. Er ruft die Downstream-API auf – den Azure Management Subscriptions-Endpunkt.
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)
(Erweitert) Zugreifen auf den Tokencache des angemeldeten Benutzers aus Hintergrund-Apps, APIs und Diensten
Sie können mit der Tokencacheimplementierung von MSAL Hintergrund-Apps, APIs und Diensten die Verwendung des Zugriffstokencaches ermöglichen, um bei Abwesenheit von Benutzern weiterhin in deren Auftrag zu agieren. Dies ist besonders nützlich, wenn die Hintergrund-Apps und Dienste im Auftrag des Benutzers weiterhin funktionieren müssen, nachdem der Benutzer die Front-End-Web-App beendet hat.
Heutzutage verwenden die meisten Hintergrundprozesse Anwendungsberechtigungen, wenn sie mit den Daten eines Benutzers arbeiten müssen, ohne dass dieser zum Authentifizieren oder erneuten Authentifizieren anwesend ist. Da Anwendungsberechtigungen häufig eine Zustimmung des Administrators erfordern, was eine Erhöhung von Berechtigungen erfordert, entstehen vermeidbare Reibungsverluste, wenn der Entwickler nicht beabsichtigte, eine Berechtigung abzurufen, die über die Berechtigung hinausgeht, in die der Benutzer ursprünglich für seine App eingewilligt hat.
Dieses Codebeispiel auf GitHub zeigt, wie Sie diese vermeidbaren Reibungsverluste vermeiden, indem Sie über Hintergrund-Apps auf den Tokencache von MSAL zugreifen:
Zugreifen auf den Tokencache des angemeldeten Benutzers über Hintergrund-Apps, APIs und Dienste