Nadat u een clienttoepassingsobject hebt gemaakt, gebruikt u dit om een token te verkrijgen dat u kunt gebruiken om een web-API aan te roepen.
Microsoft.Identity.Web voegt uitbreidingsmethoden toe die handige services bieden voor het aanroepen van Microsoft Graph of een downstream-web-API. Deze methoden worden uitgebreid beschreven in een web-app die web-API's aanroept: een API aanroepen. Met deze helpermethoden hoeft u geen token handmatig te verkrijgen.
Als u echter handmatig een token wilt verkrijgen, ziet u in de volgende code een voorbeeld van het gebruik van Microsoft.Identity.Web in een homecontroller. Microsoft Graph wordt aangeroepen met behulp van de REST API (in plaats van de Microsoft Graph SDK). Meestal hoeft u geen token op te halen. U moet een autorisatieheader maken die u aan uw aanvraag toevoegt. Als u een autorisatieheader wilt ophalen, injecteert u de IAuthorizationHeaderProvider
service door afhankelijkheidsinjectie in de constructor van uw controller (of de paginaconstructor als u Blazor gebruikt) en gebruikt u deze in de controlleracties. Deze interface bevat methoden die een tekenreeks produceren die het protocol bevat (Bearer, Pop, ...) en een token. Als u een autorisatieheader wilt ophalen om namens de gebruiker een API aan te roepen, gebruikt u (CreateAuthorizationHeaderForUserAsync
). Als u een autorisatieheader wilt ophalen om een downstream-API namens de toepassing zelf aan te roepen, gebruikt u (CreateAuthorizationHeaderForAppAsync
in een daemon-scenario).
De controllermethoden worden beveiligd door een [Authorize]
kenmerk dat ervoor zorgt dat alleen geverifieerde aanroepen de web-API kunnen gebruiken.
[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);
}
}
Zie een web-API die web-API's aanroept: een API aanroepen voor meer informatie over de callTodoListService
methode.
De code voor ASP.NET is vergelijkbaar met de code die wordt weergegeven voor ASP.NET Core:
- Een controlleractie, beveiligd met een kenmerk [Autoriseren], extraheert de tenant-id en de gebruikers-id van het
ClaimsPrincipal
lid van de controller. (ASP.NET gebruikt HttpContext.User
.) Microsoft.Identity.Web.OWIN voegt uitbreidingsmethoden toe aan de Controller die handige services biedt om Microsoft Graph of een downstream-web-API aan te roepen, of om een autorisatieheader of zelfs een token op te halen. De methoden die worden gebruikt om een API rechtstreeks aan te roepen, worden in detail uitgelegd in een web-app die web-API's aanroept: een API aanroepen. Met deze helpermethoden hoeft u geen token handmatig te verkrijgen.
Als u echter handmatig een token wilt verkrijgen of een autorisatieheader wilt maken, ziet u in de volgende code hoe u Microsoft.Identity.Web gebruikt om dit in een controller te doen. Er wordt een API (Microsoft Graph) aangeroepen met behulp van de REST API in plaats van de Microsoft Graph SDK.
Als u een autorisatieheader wilt ophalen, krijgt u een IAuthorizationHeaderProvider
service van de controller met behulp van een extensiemethode GetAuthorizationHeaderProvider
. Als u een autorisatieheader wilt ophalen om namens de gebruiker een API aan te roepen, gebruikt u (CreateAuthorizationHeaderForUserAsync
). Als u een autorisatieheader wilt ophalen om een downstream-API namens de toepassing zelf aan te roepen, gebruikt u (CreateAuthorizationHeaderForAppAsync
in een daemon-scenario).
De controllermethoden worden beveiligd door een [Authorize]
kenmerk dat ervoor zorgt dat alleen geverifieerde gebruikers de web-app kunnen gebruiken.
Het volgende codefragment toont de actie van de HomeController
, waarmee een autorisatieheader wordt opgehaald om Microsoft Graph aan te roepen als een REST API:
[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);
}
}
Het volgende codefragment toont de actie van het MyApiController
, waarmee een toegangstoken wordt opgehaald om Microsoft Graph aan te roepen als een REST API:
[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);
}
}
Hier volgt een voorbeeld van code die wordt aangeroepen in de acties van de API-controllers. De downstream-API wordt aangeroepen - 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);
}
}
Voor een Python-web-API is het gebruik van middleware vereist om het bearer-token te valideren dat is ontvangen van de client. De web-API kan vervolgens het toegangstoken voor een downstream-API verkrijgen met behulp van de MSAL Python-bibliotheek door de methode aan te acquire_token_on_behalf_of
roepen.
Hier volgt een voorbeeld van code waarmee een toegangstoken wordt verkregen met behulp van de acquire_token_on_behalf_of
methode en het Flask-framework. Hiermee wordt de downstream-API aangeroepen: het eindpunt van Azure Management-abonnementen.
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)
(Geavanceerd) Toegang tot de tokencache van de aangemelde gebruiker vanuit achtergrond-apps, API's en services
U kunt de implementatie van de tokencache van MSAL gebruiken om achtergrond-apps, API's en services toe te staan de toegangstokencache te gebruiken om te blijven handelen namens gebruikers die niet aanwezig zijn. Dit is vooral handig als de achtergrond-apps en -services namens de gebruiker moeten blijven werken nadat de gebruiker de front-end web-app heeft afgesloten.
Tegenwoordig gebruiken de meeste achtergrondprocessen toepassingsmachtigingen wanneer ze met de gegevens van een gebruiker moeten werken zonder dat deze gebruiker zelf aanwezig is om te verifiëren of opnieuw te verifiëren. Omdat toepassingsmachtigingen vaak beheerderstoestemming vereisen, waarvoor uitbreiding van bevoegdheden is vereist, is onnodige wrijving opgetreden omdat de ontwikkelaar niet van plan was om machtigingen te verkrijgen die de gebruiker oorspronkelijk heeft toegestaan voor de app.
Dit codevoorbeeld op GitHub laat zien hoe u deze onnodige wrijving kunt voorkomen door toegang te krijgen tot de tokencache van MSAL vanuit achtergrond-apps:
Toegang tot de tokencache van de aangemelde gebruiker voor achtergrond-apps, API's en services