下载 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 应用进行身份验证时所需的设置。

设置 说明
客户端 ID 应用程序使用客户端 ID 向其请求权限的用户标识其自身。 要获取 Power BI 应用客户端 ID,请参阅如何获取客户端应用 ID
客户端密钥 当向 Azure AD 进行身份验证时,客户端密钥会随客户端 ID 一起发送以调用 Web API。 要获取 Power BI 应用客户端密钥,请参阅如何获取客户端密钥
资源 URI 要为其授权的 Power BI 资源的资源 URI。 必须使用此确切的 URI。 https://analysis.windows.net/powerbi/api
颁发机构 URI 颁发机构 URI 是一种 Azure 资源,其采用客户端 ID 获取访问令牌。 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 应用程序使用客户端 ID 向其请求权限的用户标识其自身。 当你注册 Azure 应用时将获取客户端 ID。
resource= https://analysis.windows.net/powerbi/api 要为其授权的 Power BI 资源的资源 URI。 必须使用此确切的 URI。
redirect_uri= http://localhost:13526/Redirect 在用户进行身份验证后,Azure AD 将重定向回 Web 应用。

下面是一个用于创建具有查询字符串的 Azure AD 授权 URL、并重定向到 Azure AD 颁发机构服务的 C# 代码示例。

示例 – 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 应用中,可使用 Azure AD Authentication Library for .NET NuGet 程序包获取访问令牌。 如果你没有 Windows Azure 身份验证库 (ADAL),请参阅如何添加 Azure Active Directory 身份验证库

在你的应用重定向到 Azure AD 颁发机构 URI 并获取授权代码后,此应用程序将通过授权代码获取令牌。 此处介绍应用如何获取授权代码和访问令牌:在“重定向”类中

  1. 获取从 Azure AD 返回的 Azure AD 身份验证代码。

    string code = Request.Params.GetValues(0)[0];
    
  2. 创建用于传递颁发机构 URI 和 TokenCache 的 AuthenticationContext

    TokenCache TC = new TokenCache();
    
    AuthenticationContext AC = new AuthenticationContext(authorityUri, TC);
    
  3. 创建用于传递 Azure 应用客户端 ID 和 Azure 应用客户端密钥的 ClientCredential

    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,即可获取 Azure 访问令牌,方法是获取 AuthenticationResultAccessToken 属性。 以下是用于获取 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 身份验证库,然后单击“安装”。

另请参阅

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