Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
现在你已有令牌,可以调用受保护的 Web API 了。 通常从 Web 应用的控制器或页面调用下游 API。
调用受保护的 Web API
调用受保护的 Web API 取决于所选的语言和框架:
使用 Microsoft.Identity.Web 时,有三个用于调用 API 的使用选项:
- 选项 1:通过 Microsoft Graph SDK 调用 Microsoft Graph
- 选项 2:使用帮助程序类调用下游 Web API
- 选项 3:在不使用帮助程序类的情况下调用下游 Web API
选项 1:使用 SDK 调用 Microsoft Graph
在此方案中,通过添加 Microsoft.Identity.Web.GraphServiceClient NuGet 包并在 Startup.cs 中加入 .AddMicrosoftGraph()
(如代码配置中所指定)来调用 Microsoft Graph。 然后,可以直接将 GraphServiceClient
注入你的控制器或页面构造函数,以在操作中使用它。 以下示例 Razor 页面显示已登录用户的照片。
[Authorize]
[AuthorizeForScopes(Scopes = new[] { "https://microsoftgraph.chinacloudapi.cn/user.read" })]
public class IndexModel : PageModel
{
private readonly GraphServiceClient _graphServiceClient;
public IndexModel(GraphServiceClient graphServiceClient)
{
_graphServiceClient = graphServiceClient;
}
public async Task OnGet()
{
var user = await _graphServiceClient.Me.GetAsync();
try
{
using (var photoStream = await _graphServiceClient.Me.Photo.Content.GetAsync())
{
byte[] photoByte = ((MemoryStream)photoStream).ToArray();
ViewData["photo"] = Convert.ToBase64String(photoByte);
}
ViewData["name"] = user.DisplayName;
}
catch (Exception)
{
ViewData["photo"] = null;
}
}
}
如需完整示例,请参阅调用 Microsoft Graph 的 ASP.NET Core Web 应用。
选项 2:使用帮助程序类调用下游 Web API
你想要调用 Microsoft Graph 以外的 Web API。 在这种情况下,你按代码配置中指定的那样将 AddDownstreamApi
添加到 Startup.cs 中,然后可以直接将 IDownstreamApi
服务注入你的控制器或页构造函数并在操作中使用它:
[Authorize]
[AuthorizeForScopes(ScopeKeySection = "TodoList:Scopes")]
public class TodoListController : Controller
{
private IDownstreamApi _downstreamApi;
private const string ServiceName = "TodoList";
public TodoListController(IDownstreamApi downstreamApi)
{
_downstreamApi = downstreamApi;
}
public async Task<ActionResult> Details(int id)
{
var value = await _downstreamApi.CallApiForUserAsync(
ServiceName,
options =>
{
options.RelativePath = $"me";
});
return View(value);
}
}
CallWebApiForUserAsync
还具有强类型的泛型重写,使你能够直接接收对象。 例如,下面的方法收到一个 Todo
实例,该实例是 Web API 返回的 JSON 的强类型表示形式。
// GET: TodoList/Details/5
public async Task<ActionResult> Details(int id)
{
var value = await _downstreamApi.CallApiForUserAsync<object, Todo>(
ServiceName,
null,
options =>
{
options.HttpMethod = HttpMethod.Get;
options.RelativePath = $"api/todolist/{id}";
});
return View(value);
}
有关完整示例,请参阅调用 API 的 ASP.NET Core Web 应用
选项 3:在不使用帮助程序类的情况下调用下游 Web API
你已决定使用 IAuthorizationHeaderProvider
服务手动获取令牌,现在需要使用该令牌。 在这种情况下,以下代码继续演示调用 Web API 的 Web 应用:获取应用的令牌中显示的示例代码。 该代码将在 Web 应用控制器的操作中调用。
获取令牌后,将其用作持有者令牌以调用下游 API(在本例中为 Microsoft Graph)。
public async Task<IActionResult> Profile()
{
// Acquire the access token.
string[] scopes = new string[]{"https://microsoftgraph.chinacloudapi.cn/user.read"};
string authorizationHeader = await IAuthorizationHeaderProvider.GetAuthorizationHeaderForUserAsync(scopes);
// Use the access token to call a protected web API.
HttpClient httpClient = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", authorizationHeader);
var response = await httpClient.GetAsync($"{webOptions.GraphApiUrl}/beta/me");
if (response.StatusCode == HttpStatusCode.OK)
{
var content = await response.Content.ReadAsStringAsync();
dynamic me = JsonConvert.DeserializeObject(content);
ViewData["Me"] = me;
}
return View();
}
注意
可以使用相同的原则来调用任何 Web API。
大多数 Azure Web API 都提供了可简化 API 调用的 SDK,Microsoft Graph 就是这样。