NullReferenceException в Microsoft.IdentityModel.Клиенты.ActiveDirectory.AcquireToken

Я пытаюсь заставить некоторые образцы MSFT Power BI SDK работать. К сожалению, Microsoft.IdentityModel.Клиенты.Библиотека ActiveDirectory дает мне много проблем с начальным шагом внешней аутентификации.

Я использую Microsoft.IdentityModel.Клиенты.ActiveDirectory, Version=2.28.3.860, from NuGet; это последняя версия библиотеки до удаления AcquireToken, и я не понял, как использовать ее замену (AcquireTokenAsync) таким образом, который эквивалентен тому, что я вижу в образцах.

Когда я беру следующий код и изменяю строки TODO, чтобы указать мой фактический идентификатор клиента Azure и страницу перенаправления проверки подлинности, я добираюсь до строки AcquireToken.

using System;
using Microsoft.IdentityModel.Clients.ActiveDirectory;

public class Application
{
    public static void Main(string[] args)
    {
        try
        {
            string clientID = "abcdef01-1234-1234-abcd-abcdabcd1234"; // TODO: actual Azure client ID
            string redirectUri = "https://acmecorporation.okta.com/login/do-login"; // TODO: actual redirect
            string resourceUri = "https://analysis.windows.net/powerbi/api";
            string authorityUri = "https://login.windows.net/common/oauth2/authorize";

            AuthenticationContext authContext = new AuthenticationContext(authorityUri);
            AuthenticationResult ar = authContext.AcquireToken(
                    resourceUri,
                    clientID,
                    new Uri(redirectUri),
                    PromptBehavior.RefreshSession);
            string token = ar.AccessToken;
            Console.WriteLine("Success: " + token);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }
}

В этот момент:

  1. Появится окно «войдите в свою учетную запись» с именем приложения, связанного в Azure с идентификатором GUID clientID
  2. Я перенаправлен на страницу входа в свою организацию («acmecorporation»)
  3. Вход с помощью учетных данных AD
  4. Метод AcquireToken вызывает следующее NullReferenceExpection:

    System.NullReferenceException: Object reference not set to an instance of an object.
     at Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.RunAsyncTask[T](Task`1 task)
     at Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.AcquireToken(String resource, String clientId, Uri redirectUri, PromptBehavior promptBehavior)
     at PowerBISample.Application.Main(String[] args) in noxfileusersehirstdocumentsvisual studio 2015ProjectsPowerBISamplePowerBISampleProgram.cs:line 18
    

Может ли кто-нибудь подсказать, как пройти через это? Моя цель состоит в том, чтобы заставить POC работать, чтобы определить, можем ли мы интегрировать Power BI в более крупное приложение, но пока кажется, что я бета-тестирование довольно нестабильной системы.

1 ответ

  1. NullReferenceException является ошибкой в 2.x версия библиотеки ADAL; она исправлена в текущих версиях. Это было вызвано неправильным значением redirectUri ; к сожалению, документация была разрежена на этом. Рабочий образец кода, адаптированный (спасибо Канишка!) для использования текущей версии 3.13.7 ADAL, опубликованной ниже.

    namespace PowerBISample
    {
        using System;
        using Microsoft.IdentityModel.Clients.ActiveDirectory;
        using System.Threading.Tasks;
    
        public class Application
        {
            public static void Main(string[] args)
            {
                Run();
                Console.ReadLine();
            }
    
            static async void Run()
            {
                try
                {
                    string clientID = "abcdef01-1234-1234-abcd-abcdabcd1234"; // TODO: actual Azure client ID
    
                     /** THE REAL PROBLEM WAS HERE **/
                    string redirectUri = "https://login.live.com/oauth20_desktop.srf";
    
                    string resourceUri = "https://analysis.windows.net/powerbi/api";
                    string authorityUri = "https://login.windows.net/common/oauth2/authorize";
    
                    AuthenticationContext authContext = new AuthenticationContext(authorityUri);
    
                    AuthenticationResult ar = await authContext.AcquireTokenAsync(resourceUri, clientID, new Uri(redirectUri), new PlatformParameters(PromptBehavior.RefreshSession));
                    string token = ar.AccessToken;
                    Console.WriteLine("Success: " + token);
                }
                catch (Exception ex)
                {
                    string error = ex.ToString();
                    Console.WriteLine(error);
                }
            }
        }
    }