Nach dem Erstellen eines Clientanwendungsobjekts rufen Sie damit ein Token ab. Dieses verwenden Sie anschließend, eine Web-API aufzurufen.
Von Microsoft.Identity.Web werden Erweiterungsmethoden hinzugefügt, die praktische Dienste zum Aufrufen von Microsoft Graph oder einer Downstream-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
). Verwenden Sie zum Abrufen eines Autorisierungsheaders zum Aufrufen einer Downstream-API für die Anwendung selbst in einem Daemon-Szenario (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 GetAuthorizationHeaderProvider
-Erweiterungsmethode einen IAuthorizationHeaderProvider
-Dienst vom Controller ab. Zum Abrufen eines Autorisierungsheaders zum Aufrufen einer API für den Benutzer verwenden Sie (CreateAuthorizationHeaderForUserAsync
). Verwenden Sie zum Abrufen eines Autorisierungsheaders zum Aufrufen einer Downstream-API für die Anwendung selbst in einem Daemon-Szenario (CreateAuthorizationHeaderForAppAsync
).
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 HomeController
-Aktion, mit der ein Autorisierungsheader zum Aufrufen von Microsoft Graph als REST-API 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 über Hintergrund-Apps, APIs und Dienste
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