웹앱 샘플 다운로드 | GitHub에서 코드 보기: Default.aspx.cs | Redirect.aspx.cs

이 문서에서는 Power BI 웹앱을 인증하는 방법을 보여 줍니다. 여기에는 C#의 예제가 포함되어 있지만 다른 웹 프로그래밍 언어의 인증 프로세스도 동일합니다. GitHub에 웹앱 샘플이 있습니다. 샘플 실행 방법은 웹앱 샘플을 참조하세요.

Power BI 웹앱은 Active Directory(AAD)를 사용하여 사용자를 인증하고 응용 프로그램을 보호합니다. 인증은 앱 또는 사용자를 식별하는 프로세스입니다. AAD에서 웹앱을 식별하려면 AAD에 앱을 등록합니다. AAD에 웹앱을 등록하면 앱에 Power BI REST API 리소스에 대한 액세스 권한이 부여됩니다. Power BI 웹앱을 등록하는 방법을 알아보려면 웹앱 등록을 참조하세요.

Azure AD(Azure Active Directory) 권한 부여 흐름에 대해 알아보려면 인증 코드 부여 흐름을 참조하세요.

참고 Power BI의 경우, 앱은 Azure 관리 포털을 사용하는 다중 테넌트 앱으로 생성됩니다.

Power BI 웹앱을 인증하기 위해 필요한 요소

여기에서는 Power BI 웹앱을 인증하고 REST 웹 요청을 수행하는 단계를 설명합니다. 이 단계는 ASP.NET 웹앱에 적용되지만, 다른 플랫폼에도 적용됩니다. Azure AD의 OAuth 2.0에 대한 자세한 정보는 Azure AD의 OAuth 2.0을 참조하세요.

1단계 - 웹앱 등록

Azure Active Directory에 웹앱을 등록하면 앱에 Power BI REST API 리소스에 대한 액세스 권한이 부여됩니다. Power BI 웹앱을 등록하려면 웹앱 등록을 참조하세요.

2단계 - Azure AD로 인증하도록 Power BI 설정 구성

Azure AD에서 Power BI 웹앱을 인증하는 데 필요한 설정은 다음과 같습니다.

설정 설명
클라이언트 ID 클라이언트 ID는 응용 프로그램이 사용 권한을 요청하는 사용자에게 자신을 식별하는 데 사용됩니다. Power BI 앱 클라이언트 ID를 가져오려면 클라이언트 앱 ID를 가져오는 방법을 참조하세요.
클라이언트 암호 클라이언트 암호 키는 Web API를 호출하기 위해 Azure AD에 인증할 때 클라이언트 ID와 함께 전송됩니다. Power BI 앱 클라이언트 보안 키를 가져오려면 클라이언트 암호 키를 가져오는 방법을 참조하세요.
리소스 URI Power BI 리소스에 인증될 리소스 URI입니다. 정확한 URI를 사용해야 합니다. https://analysis.windows.net/powerbi/api
인증 기관 URI 인증 기관 URI는 클라이언트 ID를 받아 액세스 토큰을 가져오는 Azure 리소스입니다. https://login.windows.net/common/oauth2/authorize
리디렉션 URL 웹앱 URL에 대한 리디렉션 URL입니다. Azure AD 서비스는 인증 코드와 함께 웹앱으로 다시 리디렉션됩니다. 예: http://localhost:13526/Redirect

3단계 - Azure AD에서 인증 코드를 가져오는 쿼리 문자열 만들기

Power BI 웹앱을 인증하려면, 먼저 Azure AD 인증 서비스로 리디렉션하는 URL 쿼리 문자열을 만듭니다. 유효한 자격 증명을 입력한 후, Azure AD는 인증 코드를 반환합니다. 다음은 쿼리 문자열로 완전히 정규화된 Azure AD의 예입니다. 이와 유사한 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는 웹앱으로 다시 리디렉션합니다.

다음은 쿼리 문자열을 사용하여 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 웹앱에서 .NET nuget 패키지용 Azure AD 인증 라이브러리를 사용하여 액세스 토큰을 가져옵니다. Microsoft 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. AuthenticationResult에 세션 “authResult” 인덱스 문자열을 설정하면 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를 통해 확보된 액세스 토큰을 전달하여 인증된 사용자를 대신하여 수행됩니다. Active Directory(AAD)에서 액세스 토큰을 가져온 후, 토큰을 사용하여 Power BI REST API에 웹 요청을 만듭니다.

일단 인증 코드( AcquireTokenByAuthorizationCode )에 의한 토큰을 확보하여AuthenticationResult를 설정하면 AuthenticationResultAccessToken속성을 가져와서 Azure 액세스 토큰을 가져옵니다. 다음은 Power BI 데이터 집합을 가져오는 코드입니다. 코드 샘플은 WebRequest 를 만들고 응답 문자열을 데이터 집합으로 역직렬화합니다. Power BI REST API에 액세스하려면 “인증”을 “전달자 {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 인증 라이브러리
.NET용 ADAL(Active Directory 인증 라이브러리) v1
Azure AD의 OAuth 2.0
인증 코드 부여 흐름
Azure AD에 대한 인증 시나리오
궁금한 점이 더 있나요? Power BI 커뮤니티를 이용하세요.