2016-12-28 26 views
0

我試圖讓一些MSFT Power BI SDK示例工作。不幸的是,Microsoft.IdentityModel.Clients.ActiveDirectory庫爲初始外部認證步驟帶來了很多麻煩。Microsoft.IdentityModel.Clients.ActiveDirectory.AcquireToken中的NullReferenceException

我使用的是NuGet的Microsoft.IdentityModel.Clients.ActiveDirectory,Version = 2.28.3.860;這是AcquireToken被刪除之前庫的最後一個版本,我還沒有想到如何使用替換(AcquireTokenAsync),這與我在示例中看到的方式相同。

當我採取以下代碼並修改TODO行來指定我的實際Azure客戶端ID和身份驗證重定向頁面時,我將獲得儘可能多的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. A「登錄到您的賬戶」窗口,我已經在Azure中與clientID的GUID
  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 \\noxfile\users\ehirst\documents\visual studio 2015\Projects\PowerBISample\PowerBISample\Program.cs:line 18 
    

任何人都可以提供關於如何突破這個指導?我的目標是讓POC努力確定我們是否可以將Power BI集成到更大的應用程序中,但到目前爲止,我覺得我正在測試一個相當不穩定的系統。

+0

你應該https://github.com/AzureAD/azure-activedirectory-library-for-dotnet文件全堆棧跟蹤的錯誤 –

+0

的【什麼是一個NullReferenceException,以及如何修復它可能的複製?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) –

+0

Thanks @ KanishkPanwar-MSFT。是;我對Power BI和ADAL都很陌生。知道ADAL開源代碼中的問題應該足以推進。 –

回答

0

NullReferenceException是ADAL庫的2.x版本中的一個錯誤;它在當前版本中是固定的。它由不正確的值redirectUri觸發;不幸的是這篇文檔很稀少。一個工作代碼示例,改編(感謝Kanishk!)使用ADAL的當前版本3.13.7,發佈如下。

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); 
      } 
     } 
    } 
}