2016-12-28 2 views
0

Ich versuche, einige MSFT Power BI SDK-Beispiele zu arbeiten. Leider bereitet mir die Microsoft.IdentityModel.Clients.ActiveDirectory-Bibliothek mit dem anfänglichen externen Authentifizierungsschritt viel Mühe.NullReferenceException in Microsoft.IdentityModel.Clients.ActiveDirectory.AcquireToken

Ich verwende Microsoft.IdentityModel.Clients.ActiveDirectory, Version = 2.28.3.860, von NuGet; Dies ist die letzte Version der Bibliothek, bevor AcquireToken entfernt wurde, und ich habe nicht herausgefunden, wie ich die Ersetzung (AcquireTokenAsync) in einer Weise verwenden kann, die der in den Beispielen gezeigten entspricht.

Wenn ich den folgenden Code nehme und die TODO-Zeilen ändere, um meine tatsächliche Azure-Client-ID und Authentifizierungsumleitungsseite anzugeben, komme ich bis zur AcquireToken-Zeile.

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

An dieser Stelle:

  1. A "Melden Sie sich zu Ihrem Konto in" Fenster mit dem Namen der App erscheint ich in Azure mit dem clientID GUID
  2. Ich bin zugeordnet haben
  3. die AcquireToken Methode führt die folgende NullReferenceExpection umgeleitet zu meiner Organisation („acmecorporation“) anmelden auf Seite

  4. I
  5. meine AD-Anmeldeinformationen melden Sie sich mit:

    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 
    

Kann jemand Hinweise geben, wie diese Vergangenheit zu bekommen? Mein Ziel ist es, mit einem POC zu ermitteln, ob wir Power BI in eine größere Anwendung integrieren können, aber bisher habe ich das Gefühl, dass ich ein ziemlich instabiles System testen werde.

+0

Sie einen Fehler mit voller Stacktrace bei https://github.com/AzureAD/azure-activedirectory-library-for-dotnet Datei sollte –

+0

Mögliche Duplikat [Was für eine Nullreferenceexception ist, und wie kann ich es beheben ?] (http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-fix-it) –

+0

Danke @ KanishkPanwar-MSFT. Ja; Ich bin neu in Power BI und ADAL. Zu wissen, dass das Problem im ADAL-Quellcode liegt, sollte ausreichen, um weiter zu gehen. –

Antwort

0

Die NullReferenceException ist ein Fehler in der 2.x-Version der ADAL-Bibliothek. Es ist in den aktuellen Versionen behoben. Es wurde durch einen falschen Wert von redirectUri ausgelöst; Leider war die Dokumentation zu diesem Thema spärlich. Ein funktionierendes Codebeispiel, angepasst (danke an Kanishk!), Um die aktuelle Version 3.13.7 von ADAL zu verwenden, ist unten veröffentlicht.

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