У меня есть простое веб-приложение ASP.Net, состоящее из .aspx web из облачного сервиса Azure. В моем приложении нет логина пользователя.
Я хочу подключиться к Microsoft Graph API и использовать Microsoft Bookings API для получения коллекции BookingBusiness при загрузке моей домашней страницы без входа пользователя. В настоящее время я отлаживаю свое веб-приложение на рабочем столе с помощью эмулятора Azure.
У меня есть доступ к премиум-аккаунту в офисе 365, связанный с моей учетной записью в Майкрософт (v-sheeal@microsoft.com), и я создал бизнес по бронированию, используя мои псевдонимы с помощью инструментов бронирования (https://outlook.office.com/owa/?path=/bookings).)
Я зарегистрировал приложение в AAD в том же клиенте со всеми необходимыми разрешениями и предоставил идентификатор и секретный код в коде для получения токена доступа. Я использую учетные данные клиента для предоставления токена доступа и пытаюсь вызвать API бронирования. Я могу получить токен доступа, но когда код пытается получить список предприятий по бронированию, он дает исключение ниже.
DataServiceClientException: {
"ошибка": {
"код": "",
"message": "В этом запросе отказано в авторизации.",
"innerError": {
"request-id": "d0ac6470-9aae-4cc2-9bf3-ac83e700fd6a",
«дата»: «2018-09-03T08: 38: 29»
}
}
}
Код и подробная информация о настройках зарегистрированного приложения приведены на снимке экрана ниже.
.aspx.cs
private static async Task<AuthenticationResult> AcquireToken()
{
var tenant = "microsoft.onmicrosoft.com";
//"yourtenant.onmicrosoft.com";
var resource = "https://graph.microsoft.com/";
var instance = "https://login.microsoftonline.com/";
var clientID = "7389d0b8-1611-4ef9-a01f-eba4c59a6427";
var secret = "mxbPBS10|[#!mangJHQF791";
var authority = $"{instance}{tenant}";
var authContext = new AuthenticationContext(authority);
var credentials = new ClientCredential(clientID, secret);
var authResult = await authContext.AcquireTokenAsync(resource,
credentials);
return authResult;
}
protected void MSBooking()
{
var authenticationContext = new
AuthenticationContext(GraphService.DefaultAadInstance,
TokenCache.DefaultShared);
var authenticationResult = AcquireToken().Result;
var graphService = new GraphService(
GraphService.ServiceRoot,
() => authenticationResult.CreateAuthorizationHeader());
// Get the list of booking businesses that the logged on user can see.
var bookingBusinesses = graphService.BookingBusinesses; ----- this
line throwing an exception "Authorization has been denied for
this request."
}
GraphService.cs
namespace Microsoft.Bookings.Client
{
using System;
using System.Net;
using Microsoft.OData;
using Microsoft.OData.Client;
public partial class GraphService
{
/// <summary>
/// The resource identifier for the Graph API.
/// </summary>
public const string ResourceId = "https://graph.microsoft.com/";
/// <summary>
/// The default AAD instance to use when authenticating.
/// </summary>
public const string DefaultAadInstance =
"https://login.microsoftonline.com/common/";
/// <summary>
/// The default v1 service root
/// </summary>
public static readonly Uri ServiceRoot = new
Uri("https://graph.microsoft.com/beta/");
/// <summary>
/// Initializes a new instance of the <see
cref="BookingsContainer"/> class.
/// </summary>
/// <param name="serviceRoot">The service root.</param>
/// <param name="getAuthenticationHeader">A delegate that returns
the authentication header to use in each request.</param>
public GraphService(Uri serviceRoot, Func<string>
getAuthenticationHeader)
: this(serviceRoot)
{
this.BuildingRequest += (s, e) => e.Headers.Add("Authorization",
getAuthenticationHeader());
}
}