Power BI Report Server 單點登錄集成
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 的回應返回給第三方應用。
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.
如上圖,點擊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 。
添加完成後,服務中將可以看到 Claims to Windows Token Service,安裝完後,它的啟動方式是 「手工啟動」 可以將啟動方式 修改為自動,保障該服務在 伺服器重啟後能自動啟動。
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。
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);
}
}
}