График Microsoft токен не содержит разрешений, или разрешения не могут быть поняты - PullRequest
0 голосов
/ 17 января 2019

Я работаю с Microsoft Graph и создал приложение, которое читает почту от определенного пользователя.

Однако после получения токена доступа и попытки прочитать почтовые папки я получаю 401 Несанкционированный ответ. Подробное сообщение:

Маркер не содержит разрешений, или разрешения не могут быть поняты .

Это кажется довольно ясным сообщением, но, к сожалению, я не могу найти решение. Это то, что я сделал до сих пор:

Разрешения: enter image description here enter image description here - Напишите приведенный ниже код для получения токена доступа:

 // client_secret retrieved from secure storage (e.g. Key Vault)
 string tenant_id = "xxxx.onmicrosoft.com";
 ConfidentialClientApplication client = new ConfidentialClientApplication(
 "..",
 $"https://login.microsoftonline.com/{tenant_id}/",
 "https://dummy.example.com", // Not used, can be any valid URI 
 new ClientCredential(".."),
 null, // Not used for pure client credentials
 new TokenCache());
   string[] scopes = new string[] { "https://graph.microsoft.com/.default" };
   AuthenticationResult result = client.AcquireTokenForClientAsync(scopes).Result;
   string token = result.AccessToken;

Пока все хорошо. Я получаю токен.

Теперь я хочу прочитать почтовые папки:

url = "https://graph.microsoft.com/v1.0/users/{username}/mailFolders";
handler = (HttpWebRequest)WebRequest.Create(url);
handler.Method = "GET";
handler.ContentType = "application/json";
handler.Headers.Add("Authorization", "Bearer " + token);
response = (HttpWebResponse)handler.GetResponse();
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
    returnValue = sr.ReadToEnd();
}

На этот раз я получаю сообщение 401 с подробной информацией:

Маркер не содержит разрешений, или разрешения не могут быть поняты.

Я искал в Интернете, но не могу найти ответ, почему мой токен не имеет разрешений.

Спасибо за ваше время!

обновление 1

Если я использую Graph Explorer для чтения почтовых папок, то он работает нормально. Более того: если я получу идентификатор токена из моего браузера и использую его во втором фрагменте кода, то получу и результат. Итак, проблема в том, что токен я получаю с первого шага.

1 Ответ

0 голосов
/ 17 января 2019

Чтобы убедиться, что это работает так, как вы ожидаете, вы должны явно указать, для какого арендатора вы хотите получить токен доступа. (В этом арендаторе заявка должна, конечно, уже получить согласие администратора.)

Вместо «общей» конечной точки токена используйте специфичную для арендатора конечную точку:

string url = "https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token";

(Где {tenant-id} - это либо идентификатор арендатора (Guid), либо любое проверенное доменное имя.)

Я бы также настоятельно рекомендовал против самостоятельного создания запроса токена, как показано в вашем вопросе. Это может быть полезно в образовательных целях, но в долгосрочной перспективе будет небезопасным и подверженным ошибкам.

Для этого можно использовать различные библиотеки. Ниже приведен пример использования библиотеки аутентификации Microsoft (MSAL) для .NET :

// client_secret retrieved from secure storage (e.g. Key Vault)
string tenant_id = "contoso.onmicrosoft.com";
ConfidentialClientApplication client = new ConfidentialClientApplication(
    client_id,
    $"https://login.microsoftonline.com/{tenant_id}/",
    "https://dummy.example.com", // Not used, can be any valid URI 
    new ClientCredential(client_secret),
    null, // Not used for pure client credentials
    new TokenCache());

string[] scopes = new string[] { "https://graph.microsoft.com/.default" };
AuthenticationResult result = client.AcquireTokenForClientAsync(scopes).Result
string token = result.AccessToken;
// ... use token
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...