Microsoft Graph — не удалось автоматически получить токен

Я пытаюсь получить данные из графика Microsoft в своем веб-приложении.

Когда я вызываю AcquireTokenSilentAsync(), я получаю сообщение об ошибке «Не удалось получить токен автоматически. Вызовите метод AcquireToken».

Поэтому я попытался использовать метод AcquireTokenAsync(). Однако это получает токен, когда я пытаюсь получить доступ к ресурсу, я получаю 403 - Запрещено.

Я проверил это в Fiddler, и это работает.

Когда я изучаю токен из AcquireTokenAsync() и сравниваю его с токеном, полученным от скрипача, он составляет около 1/3 длины. Я не знаю, является ли это проблемой и есть ли решение?

Кто-нибудь знает решение этой проблемы?

Мой код выглядит следующим образом:

Получитьтокен():

public async static Task<AuthenticationResult> GetTokenAsync(AuthenticationContext ctx, string resourceId)
{
    ClientCredential credential = new ClientCredential(OfficeSettings.ClientId, OfficeSettings.ClientSecret);
    var userObjectId = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
    UserIdentifier ident = new UserIdentifier(userObjectId, UserIdentifierType.UniqueId);

    var redirectUrl = new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path));

    try
    {
        var result = await ctx.AcquireTokenSilentAsync(resourceId, credential, ident);
        //var result = await ctx.AcquireTokenAsync(resourceId, credential);
        LastAuthority = ctx.Authority;
        return result;
    }
    catch (AdalException e)
    {
        ctx.TokenCache.Clear();
        return null;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

GetUserEmail() (доступ к ресурсу):

private const string _allUsersUrl = "https://graph.microsoft.com/beta/users?$filter=displayName%20eq%20'{0}'";

public static async Task<List<string>> GetUserEmails(List<string> displayNames)
{
    var emails = new List<string>();
    using (var client = new HttpClient())
    {
        foreach (var name in displayNames)
        {
            var url = string.Format(_allUsersUrl, name.Replace(" ", "+")).Replace(" ", "%20");
            using (var req = new HttpRequestMessage(HttpMethod.Get, url))
            {
                var token = await GetToken();
                req.Headers.Add("Authorization", string.Format("Bearer {0}", token));
                req.Headers.TryAddWithoutValidation("Content-Type", "application/json");
                using (var response = await client.SendAsync(req))
                {
                    //TODO: Forbidden error message. However, token seems to be retrieved correctly
                    var content = await response.Content.ReadAsStringAsync();
                    foreach (var item in JObject.Parse(content)["value"])
                    {
                        emails.Add(item["userPrincipalName"].ToString());
                    }
                }
            }
        }
    }
    return emails;
}

ИЗМЕНИТЬ:

Я также проверил содержимое кеша и сравнил его с параметрами, передаваемыми в AcquireTokenSilentAsync(), и все совпало.


person DaRoGa    schedule 24.03.2016    source источник
comment
Я действительно изо всех сил пытаюсь найти решение этой проблемы? Есть ли у кого решения??   -  person DaRoGa    schedule 31.03.2016


Ответы (1)


Единственное решение, которое я нашел для этого, состояло в том, чтобы создать новое приложение Azure с точно такими же разрешениями, как и у другого, и указать моему приложению новый идентификатор клиента и секрет клиента. Я не знаю, почему это сработало, но это сработало, и теперь я могу запросить график. Я надеюсь, что это поможет кому-то в будущем.

person DaRoGa    schedule 31.03.2016