下载 .NET 客户端应用示例 | 在 GitHub 上查看代码

本文演示如何对 Power BI 客户端应用进行身份验证。 其中包括针对 C# 语言的示例;但是,身份验证过程与其他编程语言相同。

有关演示如何对 Power BI 客户端应用进行身份验证的完整 C# 示例,请参阅客户端应用示例

Power BI Web 应用程序采用 Azure Active Directory (AAD) 来验证用户身份和保护应用程序。 身份验证是指识别应用程序或用户的过程。 要在 AAD 中标识客户端应用,请向 AAD 注册你的应用。 在 AAD 中注册客户端应用时,需对应用程序授予 Power BI API 资源的访问权限。 要了解如何注册 Power BI 客户端应用,请参阅注册客户端应用

Power BI REST API 调用将以经过身份验证的用户的名义发出,这是通过传递请求的“授权”标头中的令牌实现的。 此令牌通过 Azure Active Directory 获取。

注意 对于 Power BI 个人预览版,将使用 Azure 管理门户创建多租户应用形式的应用。

你需要对 Power BI 客户端应用进行身份验证

要对 Power BI 客户端应用进行身份验证和执行 REST Web 请求,需完成以下步骤:

  1. 注册客户端应用 - 要注册 Power BI 客户端应用,请参阅注册客户端应用。 在 Azure Active Directory 中注册客户端应用时,需对应用程序授予 Power BI API 资源的访问权限。
  2. 分配应用程序的客户端 ID - 要获取应用程序的客户端 ID,请参阅如何获取客户端应用 ID。 应用程序使用客户端 ID 向其请求权限的用户标识其自身。
    • 在你的客户端应用程序代码中,将 clientID 变量分配到 Azure 应用程序的客户端 ID。
  3. 分配重定向 URI:对于客户端应用,重定向 URI 可为 AAD 提供有关其将进行身份验证的特定应用程序的更多详细信息。 统一资源标识符 (URI) 是用于标识资源的名称的值。

    • 在客户端应用程序代码中,将 redirectUri 分配到“https://login.live.com/oauth20_desktop.srf”。 由于客户端应用程序没有要重定向到的外部服务,此 URI 是客户端应用程序的标准占位符。
  4. 为 Power BI API 分配资源 URI -资源 URI 可标识 Power BI API 资源。

    • 在客户端应用程序代码中,将 resourceUri 分配到“https://analysis.windows.net/powerbi/api”。
  5. 分配 OAuth2 颁发机构 uri -颁发机构 URI 可标识 OAuth2 颁发机构资源。

    • 在客户端应用程序代码中,将颁发机构 URI 分配到“https://login.windows.net/common/oauth2/authorize”。
  6. 为 Power BI API 数据集分配数据集 URI - 数据集 URI 用于标识 Power BI API 数据集资源。

    • 在客户端应用程序代码中,将 datasetsUri 分配到 “https://api.powerbi.com/v1.0/myorg/datasets”。

要对 Power BI REST 服务发出数据请求,你需要提供一个访问令牌。 在 .NET 客户端应用中,可使用适用于nuget 程序包的 Azure AD 身份验证库获取访问令牌。 下面将介绍此过程。 下面是一个 accesstoken() 方法示例。

如果你没有 Windows Azure 身份验证库 (ADAL),请参阅 如何添加 Azure Active Directory 身份验证库

重要 要对客户端应用进行身份验证,必须添加对 Microsoft.IdentityModel.Clients.ActiveDirectory(包含在 Microsoft Azure 身份验证库 (ADAL) 中)的引用。

用于获取访问令牌的步骤

  1. 创建 AuthenticationContext 的实例 - AuthenticationContext 是用于提供令牌(为 Azure AD 资源颁发授权)的主类。 构造函数采用︰

    • OAuth2 authorityUri
            //OAuth2 authority Uri
            string authorityUri = "https://login.windows.net/common/oauth2/authorize";
    AuthenticationContext  authContext = new AuthenticationContext(authorityUri);
    
  2. 调用 authenticationcontext.acquiretoken() 以获取令牌 - 该方法采用︰

    • Power BI API resourceUri
    • 你的 Power BI 应用 clientID
    • 你的 Power BI 应用 redirectUri
    string token = authContext.AcquireToken(resourceUri, clientId, new Uri(redirectUri), PromptBehavior.RefreshSession).AccessToken;
    

有关 AuthenticationContext 为获取令牌而执行的步骤的详细信息,请参阅 Azure Authentication 上下文流

C# 示例 - 获取访问令牌

在 .NET 客户端应用中,可使用 AuthenticationContext 获取访问令牌。

      static string AccessToken()
      {
            //Get access token:
            // To call a Power BI REST operation, create an instance of AuthenticationContext and call AcquireToken
            // AuthenticationContext is part of the Active Directory Authentication Library NuGet package
            // To install the Active Directory Authentication Library NuGet package in Visual Studio,
            //  run "Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory" from the nuget Package Manager Console.

            //Resource Uri for Power BI API
            string resourceUri = "https://analysis.windows.net/powerbi/api";

            string clientId = {clientIDFromAzureAppRegistration};

            //A redirect uri gives AAD more details about the specific application that it will authenticate.
            //Since a client app does not have an external service to redirect to, this Uri is the standard placeholder for a client app.
            string redirectUri = "https://login.live.com/oauth20_desktop.srf";

            // Create an instance of AuthenticationContext to acquire an Azure access token
            // OAuth2 authority Uri
            string authorityUri = "https://login.windows.net/common/oauth2/authorize";
            AuthenticationContext authContext = new AuthenticationContext(authorityUri);

            // Call AcquireToken to get an Azure token from Azure Active Directory token issuance endpoint
            //  AcquireToken takes a Client Id that Azure AD creates when you register your client app.
            //  To learn how to register a client app and get a Client ID, see https://msdn.microsoft.com/library/dn877542(Azure.100).aspx   
            string token = authContext.AcquireToken(resourceUri, clientID, new Uri(redirectUri)).AccessToken;

            return token;
      }

使用令牌对 Power BI REST API 发出数据请求

从 Active Directory (AAD) 获取访问令牌后,可使用该令牌向 Power BI REST API 发出 Web 请求。 要创建 Power BI REST Web 请求,需将访问令牌添加到请求标头作为︰

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

C# 示例-使用令牌发出 Power BI REST API 数据请求

有关介绍如何对 Power BI 客户端应用进行身份验证以及调用所有 Power BI REST 操作的完整 C# 示例,请参阅客户端应用示例在 GitHub 上查看代码

        static dataset[] GetDatasets()
        {
            //This is sample code to illustrate a Power BI operation.
            //In a production application, refactor code into specific methods and use appropriate exception handling.

            //Power BI Datasets Url
            string powerBIApiUrl = "https://api.powerbi.com/v1.0/myorg/datasets";

            //Get Azure AD access token (see above)
            string token = AccessToken();

            //GET web request to list all datasets.
            //To get a datasets in a group, use the Groups uri: https://api.PowerBI.com/v1.0/myorg/groups/{group_id}/datasets
            HttpWebRequest request = System.Net.WebRequest.Create(powerBIApiUrl) as System.Net.HttpWebRequest;
            request.KeepAlive = true;
            request.Method = "GET";
            request.ContentLength = 0;
            request.ContentType = "application/json";

            //Add access token to Request header
            request.Headers.Add("Authorization", String.Format("Bearer {0}", token));

            //Get HttpWebResponse from GET request
            using (HttpWebResponse httpResponse = request.GetResponse() as System.Net.HttpWebResponse)
            {
                //Get StreamReader that holds the response stream
                using (StreamReader reader = new System.IO.StreamReader(httpResponse.GetResponseStream()))
                {
                    string responseContent = reader.ReadToEnd();

                    JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
                    Datasets datasets = (Datasets)jsonSerializer.Deserialize(responseContent, typeof(Datasets));

                    return datasets.value;
                }
            }
        }

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

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

Azure 身份验证上下文流

在 .NET 客户端应用中,可使用 AuthenticationContext 获取 Azure 访问令牌。 AuthenticationContext 是用于提供令牌(为 Azure AD 资源颁发授权)的主类。 AuthenticationContext 执行下列操作︰

  1. 通过将用户代理重定向到 Azure Active Directory 授权终结点,AuthenticationContext 将启动流。 用户进行身份验证并表示同意(如果必须表示同意)。

  2. Azure Active Directory 授权终结点使用授权代码将用户代理重定向回 AuthenticationContext。 用户代理将授权代码返回到客户端应用的重定向 URI。

  3. AuthenticationContext 从 Azure Active Directory 令牌颁发终结点请求访问令牌。 它将提供授权代码来证明用户已经同意。

  4. Azure Active Directory 令牌颁发终结点返回访问令牌。

  5. 客户端应用程序使用访问令牌向 Web API 进行身份验证。

  6. 在验证客户端应用后,Power BI REST API 返回所请求的数据。

要了解有关 Azure Active Directory (Azure AD) 授权流的详细信息,请参阅授权代码授予流

如何添加 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 身份验证库,然后单击安装

另请参阅

Azure AD Authentication Library for .NET NuGet 程序包
Active Directory Authentication Library (ADAL) v1 for .NET
Azure AD 中的 OAuth 2.0
授权代码授予流
适用于 Azure AD 的身份验证方案
更多问题? 尝试参与 Power BI 社区