下載 Web 應用程式範例 | 檢視 GitHub 上的程式碼:Default.aspx.cs | Redirect.aspx.cs

本文說明如何驗證 Power BI Web 應用程式。 這包含 C# 中的範例,但驗證程序與其他 Web 程式設計語言相同。 在 GitHub 上的 Web 應用程式範例。 若要了解如何執行範例,請參閱 Web 應用程式範例

Power BI Web 應用程式使用 Active Directory (AAD) 來驗證使用者及保護應用程式。 驗證是識別應用程式或使用者的程序。 若要在 AAD 中識別您的 Web 應用程式,請在 AAD 中註冊應用程式。 當您在 AAD 中註冊 Web 應用程式時,即是授權您應用程式可以存取 Power BI REST API 資源。 如需了解如何註冊您的 Power BI Web 應用程式,請參閱註冊 Web 應用程式

如需深入了解 Azure Active Directory (Azure AD) 授權流程,請參閱授權碼授與流程

注意針對 Power BI,會使用 Azure 管理入口網站將應用程式建立成多租用戶應用程式。

驗證 Power BI web 應用程式的準備事項

以下是驗證 Power BI Web 應用程式及執行 REST Web 要求的步驟。 這些步驟適用於 ASP.NET Web 應用程式,也適用於其他平台。 如需深入了解 Azure AD 的 OAuth 2.0,請參閱 Azure AD 的 OAuth 2.0

步驟 1 - 註冊您的 Web 應用程式

當您在 Azure Active Directory 中註冊 Web 應用程式時,即是授權您應用程式可以存取 Power BI REST API 資源。 若要註冊 Power BI Web 應用程式,請參閱註冊 Web 應用程式

步驟 2 - 將 Power BI 設定配置成向 Azure AD 驗證

以下是向 Azure AD 驗證 Power BI Web 應用程式所需的設定:

設定 描述
用戶端識別碼 用戶端識別碼可供應用程式用於向要求授權的對象使用者驗證自己的身分。 若要取得 Power BI 應用程式用戶端識別碼,請參閱如何取得用戶端應用程式識別碼
用戶端密碼 用戶端秘密金鑰會在向 Azure AD 進行驗證,以呼叫 Web API 時,隨用戶端識別碼一起傳送。 若要取得 Power BI 應用程式用戶端秘密金鑰,請參閱如何取得用戶端秘密金鑰
資源 URI 要授權之 Power BI 資源的資源 URI。 您必須使用此 URI。 https://analysis.windows.net/powerbi/api
授權單位 URI 授權單位 URI 是採用用戶端識別碼取得存取權杖的 Azure 資源。 https://login.windows.net/common/oauth2/authorize
重新導向 URL Web 應用程式 URL 的重新導向 URL。 Azure AD 服務會重新導向回 Web 應用程式 URL,並附上驗證碼。 範例:http://localhost:13526/Redirect

步驟 3 - 建立查詢字串,以從 Azure AD 取得授權碼

若要驗證的 Power BI Web 應用程式,您必須先建立 URL 查詢字串,以重新導向至 Azure AD 驗證服務。 提供有效的認證之後,Azure AD 會傳回授權碼。 下列範例是包含查詢字串的完整 Azure AD URL。 您可以使用類似的 URL 從 Azure AD 取得授權碼。 使用 Response.Redirect() 重新導向至會從 Azure AD 傳回授權碼的 Azure AD 服務。 您可以使用步驟 4 中的授權碼,取得存取權杖中的授權碼。

https://login.windows.net/common/oauth2/authorize
  ?response_type=code
  &client_id=1861585d...9a79c296
  &resource= https://analysis.windows.net/powerbi/api
  &redirect_uri= http://localhost:13526/Redirect

Power BI 驗證查詢字串設定

設定 描述
response_type=code Azure AD 傳回授權碼。
client_id=1861585d...9a79c296 用戶端識別碼可供應用程式用於向要求授權的對象使用者驗證自己的身分。 當您註冊您的 Azure 應用程式時,會獲得一組用戶端識別碼。
resource= https://analysis.windows.net/powerbi/api 要授權之 Power BI 資源的資源 URI。 您必須使用此 URI。
redirect_uri= http://localhost:13526/Redirect 使用者驗證之後,Azure AD 會重新導向回 Web 應用程式。

下列 C# 程式碼範例會建立含查詢字串的 Azure AD 授權 URL,並會重新導向至 Azure AD 授權服務。

範例 - C# 登入

    protected void signInButton_Click(object sender, EventArgs e)
    {
        //Create a query string
        //Create a sign-in NameValueCollection for query string
        var @params = new NameValueCollection
        {
            //Azure AD will return an authorization code.
            //See the Redirect class to see how "code" is used to AcquireTokenByAuthorizationCode
            {"response_type", "code"},

            //Client ID is used by the application to identify themselves to the users that they are requesting permissions from.
            //You get the client id when you register your Azure app.
            {"client_id", Properties.Settings.Default.ClientID},

            //Resource uri to the Power BI resource to be authorized
            {"resource", "https://analysis.windows.net/powerbi/api"},

            //After user authenticates, Azure AD will redirect back to the web app
            {"redirect_uri", "http://localhost:13526/Redirect"}
        };

        //Create sign-in query string
        var queryString = HttpUtility.ParseQueryString(string.Empty);
        queryString.Add(@params);

        //Redirect authority
        //Authority Uri is an Azure resource that takes a client id to get an Access token
        string authorityUri = "https://login.windows.net/common/oauth2/authorize/";
        Response.Redirect(String.Format("{0}?{1}", authorityUri, queryString));       
    }

步驟 4 – 使用授權碼取得 Azure AD 存取權杖

若要向 Power BI REST 服務提出資料要求,您需要提供存取權杖。 在 .NET Web 應用程式中,您可以使用適用於 .NET Nuget 封裝的 Azure AD 驗證程式庫來取得存取權杖。 若您沒有 Windows Azure 驗證程式庫 (ADAL),請參閱如何新增 Azure Active Directory 驗證程式庫

當應用程式重新導向至 Azure AD 授權單位 URI 並取得授權碼之後,您的應用程式會授權碼中的權杖。 以下應用程式可以取得授權碼及存取權杖的方法: 在 Redirect 類別

  1. 取得 Azure AD 傳回的 Azure AD 驗證碼。

    string code = Request.Params.GetValues(0)[0];
    
  2. 建立 AuthenticationContext ,以傳遞授權單位 URI 及 TokenCache。

    TokenCache TC = new TokenCache();
    
    AuthenticationContext AC = new AuthenticationContext(authorityUri, TC);
    
  3. 建立 ClientCredential ,以傳遞 Azure 應用程式 用戶端識別碼 及 Azure 應用程式 用戶端密碼

    ClientCredential cc = new ClientCredential(Properties.Settings.Default.ClientID, Properties.Settings.Default.ClientSecretKey);
    
  4. 取得授權碼中的權杖,以傳遞 Azure AD 及 重新導向 URL 所傳回的 驗證碼

    AuthenticationResult AR = AC.AcquireTokenByAuthorizationCode(code, new Uri(redirectUri), cc);
    
  5. 重新導向回 default.aspx。

    Response.Redirect("/Default.aspx");
    
  6. 將工作階段 "authResult" 索引字串設為 AuthenticationResult,以便能使用 default.aspx 頁面中的結果。

    Session["authResult"] = AR;
    

在 Default.aspx 頁面中

  1. 從工作階段取得 AuthenticationResult 。 在步驟 4 中,您可以使用 AuthenticationResult 取得授權 AccessToken

    AuthenticationResult authResult = (AuthenticationResult)Session["authResult"];
    

下列完整的程式碼,可用於取得授權碼中的 Azure 存取權杖,並重新導向回 default.aspx。

注意 重新導向 URI 必須與要求授權碼時使用的 redirect_uri 相符。

public partial class Redirect : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
      //Redirect uri must match the redirect_uri used when requesting Authorization code.
      string redirectUri = "http://localhost:13526/Redirect";
      string authorityUri = "https://login.windows.net/common/oauth2/authorize/";

      // Get the auth code
      string code = Request.Params.GetValues(0)[0];

      // Get auth token from auth code       
      TokenCache TC = new TokenCache();

      AuthenticationContext AC = new AuthenticationContext(authorityUri, TC);
      ClientCredential cc = new ClientCredential
          (Properties.Settings.Default.ClientID,
          Properties.Settings.Default.ClientSecret);

      AuthenticationResult AR = AC.AcquireTokenByAuthorizationCode(code, new Uri(redirectUri), cc);

      //Set Session "authResult" index string to the AuthenticationResult
      Session["authResult"] = AR;

      //Redirect back to Default.aspx
      Response.Redirect("/Default.aspx");
  }
}

public partial class _Default : Page
{
  public AuthenticationResult authResult { get; set; }
  string baseUri = "https://api.powerbi.com/beta/myorg/";

  protected void Page_Load(object sender, EventArgs e)
  {

      //Test for AuthenticationResult
      if (Session["authResult"] != null)
      {
          //Get the authentication result from the session
          authResult = (AuthenticationResult)Session["authResult"];

          //Show Power BI Panel
          signInStatus.Visible = true;

          //Set user and token from authentication result
          userLabel.Text = authResult.UserInfo.DisplayableId;
          accessTokenTextbox.Text = authResult.AccessToken;
      }
  }

  ...
}

步驟 5 - 使用 Azure AD 存取權杖呼叫 Power BI 作業

代表通過驗證的使用者發出 Power BI REST API 呼叫,方法透過 Azure Active Directory,在 “Authorization” 標頭中傳遞存取權杖。 從 Active Directory (AAD) 取得存取權杖之後,使用該權杖向 Power BI REST API 提出 Web 要求。

當您藉由取得授權碼 ( AcquireTokenByAuthorizationCode ) 中的權杖而設定AuthenticationResult時,您會獲取 AccessToken 屬性為 AuthenticationResult的 Azure 存取權杖。 下列程式碼會取得 Power BI 資料集。 此程式碼範例會建立 WebRequest ,並將回應字串還原序列化成資料集。 若要存取 Power BI REST API,必須將要求的標頭設定從 “Authorization” 變更 "Bearer {AccessToken}":

request.Headers.Add("Authorization", String.Format("Bearer {0}", authResult.AccessToken));

C# 範例 - 取得 Power BI 資料集

    protected void getDatasetsButton_Click(object sender, EventArgs e)
    {
        string responseContent = string.Empty;

        //The resource Uri to the Power BI REST API resource
        string datasetsUri = "https://api.powerbi.com/v1.0/myorg/datasets";

        //Configure datasets request
        System.Net.WebRequest request = System.Net.WebRequest.Create(datasetsUri) as System.Net.HttpWebRequest;
        request.Method = "GET";
        request.ContentLength = 0;
        request.Headers.Add("Authorization", String.Format("Bearer {0}", authResult.AccessToken));

        //Get datasets response from request.GetResponse()
        using (var response = request.GetResponse() as System.Net.HttpWebResponse)
        {
            //Get reader from response stream
            using (var reader = new System.IO.StreamReader(response.GetResponseStream()))
            {
                responseContent = reader.ReadToEnd();

                //Deserialize JSON string
                //JavaScriptSerializer class is in System.Web.Script.Serialization
                JavaScriptSerializer json = new JavaScriptSerializer();
                Datasets datasets = (Datasets)json.Deserialize(responseContent, typeof(Datasets));

                resultsTextbox.Text = string.Empty;
                //Get each Dataset from
                foreach (dataset ds in datasets.value)
                {
                    resultsTextbox.Text += String.Format("{0}\t{1}\n", ds.Id, ds.Name);
                }
            }
        }
    }

public class Datasets
{
    public dataset[] value { get; set; }
}

public class dataset
{
    public string Id { get; set; }
    public string Name { get; set; }
}

如何新增 Azure Active Directory 驗證程式庫

在.NET 用戶端應用程式中,您可以使用 Active Directory 驗證程式庫中的 AuthenticationContext 取得 Azure 的存取權杖。 您可以安裝 Visual Studio 所提供的 Active Directory 驗證程式庫 NuGet 封裝。 當您安裝 NuGet 封裝時,Visual Studio 會建立必要組件的參考。

  1. 以滑鼠右鍵按一下方案。
  2. 選擇 [管理 NuGet 封裝]。
  3. 搜尋 Active Directory 驗證程式庫。
  4. 從封裝清單中選擇 Active Directory 驗證程式庫,然後按一下 [安裝]。

另請參閱

適用於 .NET NuGet 套件的 Azure AD Authentication Library
適用於 .NET 的 Active Directory Authentication Library (ADAL) v1
Azure AD 中的 OAuth 2.0
授權碼授與流程
Azure AD 的驗證案例
有其他問題嗎? 試試 Power BI 社群