Несанкционированный в Microsoft Graph Api не может получить данные - PullRequest
0 голосов
/ 10 декабря 2018

В настоящее время я занимаюсь разработкой сайта ASP.NET MVC 5, который использует приложение Microsoft Graph API для извлечения и вставки данных в Microsoft Planner.На указанном сайте уже есть проверка подлинности Azure Active Directory.В настоящее время я использую следующий код для получения токена доступа для входа в приложение Graph API.

    public async Task<ActionResult> SignIn()
    {
        AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/common");
        string redirectUri = Url.Action("Authorize", "Planner", null, Request.Url.Scheme);
        Uri authUri = await authContext.GetAuthorizationRequestUrlAsync("https://graph.microsoft.com/", SettingsHelper.ClientId,
                                                              new Uri(redirectUri), UserIdentifier.AnyUser, null);

        // Redirect the browser to the Azure signin page
        return Redirect(authUri.ToString());
    }

    public async Task<ActionResult> Authorize()
    {
        // Get the 'code' parameter from the Azure redirect
        string authCode = Request.Params["code"];

        // The same url we specified in the auth code request
        string redirectUri = Url.Action("Authorize", "Planner", null, Request.Url.Scheme);

        // Use client ID and secret to establish app identity
        ClientCredential credential = new ClientCredential(SettingsHelper.ClientId, SettingsHelper.ClientSecret);

        TokenCache fileTokenCache = new FilesBasedAdalV3TokenCache("C:\\temp\\justin.bin");
        AuthenticationContext authContext = new AuthenticationContext(SettingsHelper.AzureADAuthorityTenantID, fileTokenCache);
        AuthenticationResult authResult = null;
        try
        {
            // Get the token silently first
            authResult = await authContext.AcquireTokenAsync(SettingsHelper.O365UnifiedResource, credential);
        }
        catch (AdalException ex)
        {
            authContext = new AuthenticationContext(SettingsHelper.AzureADAuthority, fileTokenCache);

            authResult = await authContext.AcquireTokenByAuthorizationCodeAsync(
            authCode, new Uri(redirectUri), credential, SettingsHelper.O365UnifiedResource);

            return Content(string.Format("ERROR retrieving token: {0}", ex.Message));
        }
        finally
        {
            // Save the token in the session
            Session["access_token"] = authResult.AccessToken;
        }

        return Redirect(Url.Action("Index", "Planner", null, Request.Url.Scheme));
    }

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

{  
   StatusCode:401,
   ReasonPhrase:'Unauthorized',
   Version:1.1,
   Content:System.Net.Http.StreamContent,
   Headers:{  
      Transfer-Encoding:      chunked request-id:40      b53d20-c4fc-4614-837b-57a6bebb8d79 client-request-id:40      b53d20-c4fc-4614-837b-57a6bebb8d79 x-ms-ags-diagnostic:{  
         "ServerInfo":{  
            "DataCenter":"North Europe",
            "Slice":"SliceC",
            "Ring":"2",
            "ScaleUnit":"000",
            "Host":"AGSFE_IN_17",
            "ADSiteName":"NEU"
         }
      }      Duration:28.4537      Strict-Transport-Security:      max-age=31536000 Cache-Control:      private Date:Fri,
      07      Dec 2018 14:12:50      GMT Content-Type:application/json
   }
}

Я проверил приложение Azure, и оно имеет полные права доступа.Любая помощь по этому вопросу будет принята с благодарностью

1 Ответ

0 голосов
/ 12 декабря 2018

Мне удалось решить мою проблему.Проблема заключалась в том, что Graph Api требовал, чтобы вы запускали в качестве делегированной учетной записи, а также устанавливал приложение на Azure в качестве собственного приложения.

Использовался следующий код:

        private async Task<string> GetAccessToken(string resourceId, string userName, string password)
            {
                try
                    {
                        var authority = ConfigurationManager.AppSettings["ida:AuthorizationLoginUri"] + ConfigurationManager.AppSettings["ida:TenantId"];
                        var authContext = new AuthenticationContext(authority);
                        var credentials = new UserPasswordCredential(userName, password);
                        var authResult = await authContext.AcquireTokenAsync(resourceId, ConfigurationManager.AppSettings["ida:ClientIdNativeClient"], credentials);
                        // Get the result
                        return authResult.AccessToken;
                    }
                catch (Exception ex)
                    {
                    // TODO: handle the exception
                    return;
                    }
            }

Iнашел этот сайт https://karinebosch.wordpress.com/2017/12/18/microsoft-graph/, который столкнулся с той же проблемой, что и я

...