Po vytvoření objektu klientské aplikace ho použijte k získání tokenu, který můžete použít k volání webového rozhraní API.
Microsoft.Identity.Web přidává rozšiřující metody, které poskytují pohodlné služby pro volání Microsoft Graphu nebo podřízeného webového rozhraní API. Tyto metody jsou podrobně vysvětleny ve webové aplikaci, která volá webová rozhraní API: Volání rozhraní API. Pomocí těchto pomocných metod nemusíte token získat ručně.
Pokud ale chcete token získat ručně, následující kód ukazuje příklad použití Microsoft.Identity.Web k tomu na domovském řadiči. Volá Microsoft Graph pomocí rozhraní REST API (místo sady Microsoft Graph SDK). Obvykle nepotřebujete získat token, musíte vytvořit autorizační hlavičku, kterou přidáte do požadavku. Pokud chcete získat autorizační hlavičku, vložíte IAuthorizationHeaderProvider
službu injektáží závislostí do konstruktoru kontroleru (nebo konstruktoru stránky, pokud používáte Blazor) a použijete ji v akcích kontroleru. Toto rozhraní obsahuje metody, které vytvářejí řetězec obsahující protokol (Bearer, Pop, ...) a token. Pokud chcete získat autorizační hlavičku pro volání rozhraní API jménem uživatele, použijte (CreateAuthorizationHeaderForUserAsync
). Pokud chcete získat autorizační hlavičku pro volání podřízeného rozhraní API jménem samotné aplikace, použijteCreateAuthorizationHeaderForAppAsync
().
Metody kontroleru jsou chráněny atributem [Authorize]
, který zajišťuje, že webové rozhraní API může používat pouze ověřená volání.
[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);
}
}
Podrobnosti o metodě najdete ve callTodoListService
webovém rozhraní API, které volá webová rozhraní API: Volání rozhraní API.
Kód ASP.NET se podobá kódu zobrazenému pro ASP.NET Core:
- Akce kontroleru chráněná atributem [Authorize] extrahuje ID tenanta a ID
ClaimsPrincipal
uživatele člena kontroleru. (ASP.NET používá HttpContext.User
.) Microsoft.Identity.Web.OWIN přidává do kontroleru rozšiřující metody, které poskytují služby pro usnadnění volání Microsoft Graphu nebo podřízeného webového rozhraní API nebo získání autorizační hlavičky nebo dokonce tokenu. Metody používané k přímému volání rozhraní API jsou podrobně vysvětleny ve webové aplikaci, která volá webová rozhraní API: Volání rozhraní API. Pomocí těchto pomocných metod nemusíte token získat ručně.
Pokud ale chcete token získat ručně nebo vytvořit autorizační hlavičku, následující kód ukazuje, jak to udělat v kontroleru pomocí Microsoft.Identity.Web . Volá rozhraní API (Microsoft Graph) pomocí rozhraní REST API místo sady Microsoft Graph SDK.
Pokud chcete získat autorizační hlavičku, získáte IAuthorizationHeaderProvider
službu z kontroleru pomocí metody GetAuthorizationHeaderProvider
rozšíření . Pokud chcete získat autorizační hlavičku pro volání rozhraní API jménem uživatele, použijte (CreateAuthorizationHeaderForUserAsync
). Pokud chcete získat autorizační hlavičku pro volání podřízeného rozhraní API jménem samotné aplikace, použijteCreateAuthorizationHeaderForAppAsync
().
Metody kontroleru jsou chráněny atributem [Authorize]
, který zajišťuje, že webovou aplikaci můžou používat jenom ověření uživatelé.
Následující fragment kódu ukazuje akci HomeController
, která získá autorizační hlavičku pro volání Microsoft Graphu jako rozhraní 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);
}
}
Následující fragment kódu ukazuje akci MyApiController
, která získá přístupový token pro volání Microsoft Graphu jako rozhraní 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);
}
}
Tady je příklad kódu, který se volá v akcích kontrolerů rozhraní API. Volá podřízené rozhraní 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);
}
}
Webové rozhraní API Pythonu vyžaduje použití middlewaru k ověření nosného tokenu přijatého z klienta. Webové rozhraní API pak může získat přístupový token pro podřízené rozhraní API pomocí knihovny MSAL Python voláním acquire_token_on_behalf_of
metody.
Tady je příklad kódu, který získá přístupový token pomocí acquire_token_on_behalf_of
metody a architektury Flask. Volá podřízené rozhraní API – koncový bod předplatných služby 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)
(Upřesnit) Přístup k mezipaměti tokenů přihlášeného uživatele z aplikací na pozadí, rozhraní API a služeb
Implementaci mezipaměti tokenů MSAL můžete použít k tomu, aby aplikace, rozhraní API a služby na pozadí mohly používat mezipaměť přístupových tokenů a nadále jednat jménem uživatelů v jejich nepřítomnosti. To je užitečné zejména v případě, že aplikace a služby na pozadí musí pokračovat v práci jménem uživatele poté, co uživatel ukončí front-endovou webovou aplikaci.
Většina procesů na pozadí v současné době používá oprávnění aplikace, když potřebují pracovat s daty uživatele, aniž by je bylo možné ověřit nebo znovu ověřit. Vzhledem k tomu, že oprávnění aplikací často vyžadují souhlas správce, což vyžaduje zvýšení oprávnění, dochází k zbytečným třením, protože vývojář neměl v úmyslu získat oprávnění nad rámec toho, ke kterému uživatel původně souhlasil pro svou aplikaci.
Tento ukázkový kód na GitHubu ukazuje, jak se vyhnout nepotřebným třením tím, že přistupujete k mezipaměti tokenů MSAL z aplikací na pozadí:
Přístup k mezipaměti tokenů přihlášeného uživatele z aplikací na pozadí, rozhraní API a služeb