1. 需求概述

在本地部署的Power BI Report Server 集成到 第三方應用系統時,我們需要解決應用系統與Power BI Report Server 的單點登錄問題,將第三方應用系統認證后的使用者身份 映射為 Windows帳號,並以該帳號的身份訪問 Power BI Report Server。

2. 解決方案

我們通過開發一個Http反向代理,接收第三方應用對 Power BI Report Server 的訪問請求,利用Windows Server 的 Claims to Windows Token Service 將將第三方應用系統認證后的使用者身份 映射為 Windows帳號,並類比該帳號的身份向 Power BI Report Server 轉發請求,並將Power BI Report Server 的回應返回給第三方應用。
PBIRS-C2WTS-1

3. 配置工作

該方案要正常運行,需要完成一些必要的配置工作,主要包括下面

3.1 配置Power BI Report Server 使用 Kerberos 認證方式

本方案利用了 Kerberos 认证的一些功能,需要将Power BI Report Server 配置为 Kerberos 认证方式.。

登录 运行Power BI Report Server的服务器,使用文本编辑器 打开Power BI Report Server的配置文件,一般在 “C:\Program Files\Microsoft Power BI Report Server\PBIRS\ReportServer\rsreportserver.config”。

找到 节点,在 元素 前加上 元素。

<Authentication>
    <AuthenticationTypes>
        <RSWindowsNegotiate/>	
        <RSWindowsNTLM/>
    </AuthenticationTypes>
</Authentication>

3.2 配置 Power BI Report Server 及 應用代理的 Service Principal Name (SPN)

用域管理員身份登錄域控,打開命令控制台,執行下面命令, 將Power BI Report Server 服務及應用代理服務 登記到 運行應用代理服務進程的域帳號 proxyuser 下。 注意短域名及長功能變數名稱 都需要登記。

setspn -S HTTP/ow-win-04 proxyuser 
setspn -S HTTP/ow-win-04.msftstack.com proxyuser 

setspn -S HTTP/ow-win-04:9000 proxyuser 
setspn -S HTTP/ow-win-04.msftstack.com:9000 proxyuser 

3.3 配置運行應用集成代理的伺服器的 Delegation 權限

用域管理員身份登錄域控,打開Active Directory Users and Computers 工具,找到運行應用代理程式的 電腦 (本例子中是 ow-win-04),在Delegation 下設置該 計算機可以向 Power BI Report Server 服務進行 delegation.

delegation

如上圖,點擊Add 按鈕,選擇 3.2 中setspn 登記的帳號 proxyuser ,選中登記在proxyuser 下的Power BI Report Server 服務及應用代理服務 的Service Principal Name (SPN) , 添加到該電腦的 Delegation 中。

3.4 安装及配置Claims to Windows Token Service

3.4.1 對 Windows Token Service 的聲明 介紹

Claims to Windows Token Service 是一個很特別的服務,在適當的安全配置下,它可以在不需要密碼的情況下,獲得任意指定域帳號的Windows Token, 常用與一些認證憑據轉換 以及單點登錄的場景。

比如你有一個應用,採用私有的認證協定,當應用完成使用者認證后,希望可以使用對應的Windows 帳號 (域帳號)的身份去訪問一些 通過Windows 集成認證保護的資源,而又不希望二次輸入WIndows 帳號密碼登錄的場景, 使用這個服務提供的能力可以很好地解決這個問題。
為了避免這個服務功能被利用作為安全攻擊的手段,該服務採用白名單機制,只有名單中的帳號才可以調用這個服務。

3.4.2 Claims to Windows Token Service 安裝及配置

Claims to Windows Token Service 是Windows Server 裡面帶有的服務,可以通過下面的方法安裝並啟用。

登錄 執行應用代理服務的伺服器,打開 Sever Manager,選 Add roles and features,添加Windows Identity Foundation 3.5 Feature 。

C2WTS-Install

添加完成後,服務中將可以看到 Claims to Windows Token Service,安裝完後,它的啟動方式是 「手工啟動」 可以將啟動方式 修改為自動,保障該服務在 伺服器重啟後能自動啟動。

C2WTS-Services

Claims to Windows Token Service 可以獲取任何指定的域帳號的 WindowsIdentity, 為了保障安全性,只有允許的帳號(白名單)才可以調用該服務。 下面是配置的方式:

用文本編輯器 打開 C:\Program Files\Windows Identity Foundation\v3.5\c2wtshost.exe.config 檔,在 下增加 運行運行應用代理服務進程的域帳號 MSFTSTACK\proxyuser,使該域帳號可以調用 Claims to Windows Token Service。 保存后 在服務中重啟 Claims to Windows Token Service。

C2WTS-Config

3.5 配置完成後重啟伺服器。

配置完成後,重啟運行 應用代理 及 Power BI Report Server 的伺服器,並啟動 Power BI Report Server、應用代理 以及 Claims to Windows Token Service。

4. 應用整合代理的參考實現

下面是使用 Claims to Windows Token Service 類比Windows 帳號訪問 Power BI Report Server 的主要樣例代碼:

//Get Active Directory UPN from accessToken
string upn = ConverTokenToUPN(accessToken);

//Call Claims to Windows Token Service get Windows Token
using (var id = S4UClient.UpnLogon(upn))
{
    //Impersonate Active Directory User to access Power BI Report Server
    using (id.Impersonate())
    {
        var handler = new System.Net.Http.HttpClientHandler() { UseDefaultCredentials = true };
        
        using (HttpClient httpClient = new HttpClient(handler))
        {
            //get Power BI Report Serve Request Url
            string url = ConfigurationManager.AppSettings["report-server-base-uri"] + this.Request.RequestUri.PathAndQuery;

            this.Request.RequestUri = new Uri(url);

            if (this.Request.Method == HttpMethod.Get)
            {
                this.Request.Content = null;
            }
            return await httpClient.SendAsync(this.Request);
        }
    }
}

完整的代碼我放在Github 上,供大家參考。

GitHub - Vincent-Ye/PBIRS.ProxyHost: PowerBI Report Server SSO Proxy
PowerBI Report Server SSO Proxy. Contribute to Vincent-Ye/PBIRS.ProxyHost development by creating an account on GitHub.