纵有倚天剑还要屠龙刀,实现Power BI报表服务器自定义认证

文章目录

  • 纵有倚天剑还要屠龙刀,实现Power BI报表服务器自定义认证
  • 概述
  • 如何实现
  • 配置部署和Demo
  • 排错
  • 总结

概述

在Power BI报表服务器身份认证体系上,我们默认使用AD作为认证体系,AD即活动目录体系来说,是微软整个平台的核心,可以说是倚天剑。默认情况下, Power BI 报表服务器 接受指定 Negotiate 或 NTLM 身份验证的请求。 如果部署中包括使用这些安全提供程序的客户端应用程序和浏览器,则可以使用这些默认值,而无需附加配置。 如果要使用不同的安全提供程序来获取 Windows 集成安全性(例如,如果要直接使用 Kerberos)或者修改了默认值并且要还原原始设置。

但是很多用户不使用AD作为验证,希望用自己的认证程序来进行验证,比如使用数据库用户名和密码进行验证。 Power BI 报表服务器也支持自定义安全认证,这是一把屠龙刀,实现你对验证的无限需求 。

Power BI 报表服务器提供了可扩展的体系结构,该体系结构允许您插入自定义的或基于窗体的身份验证模块。 如果部署要求不包含 Windows 集成安全性或基本身份验证,则可考虑实现自定义的身份验证扩展插件。 使用自定义身份验证的最常见情形是支持对 Web 应用程序的 Internet 或 Extranet 访问。 使用自定义身份验证扩展插件替换默认的 Windows 身份验证扩展插件,可更好地控制如何授予外部用户访问报表服务器的权限。

利用 Power BI 报表服务器 安全扩展插件,可以对用户或组进行身份验证和授权;这样,不同的用户便可登录至同一台报表服务器,并基于他们的标识执行不同的任务或操作。 默认情况下,Power BI 报表服务器 使用基于 Windows 的身份验证扩展插件,该插件使用 Windows 帐户协议来验证声明在系统上拥有帐户的用户的标识。 Power BI 报表服务器 使用基于角色的安全系统为用户授权。 Power BI 报表服务器 基于角色的安全模型与其他技术的基于角色的安全模型类似。

因为安全扩展插件基于可扩展的开放式 API,所以您可以在 Power BI 报表服务器 中创建新的身份验证和授权扩展插件。 下面的示例为使用基于窗体的身份验证和授权的典型安全扩展插件实现:

如图所示,身份验证和授权将按以下所示发生:

  1. 用户尝试使用 URL 访问 Web 门户,然后被重定向至为客户端应用程序收集用户凭据的窗体。
  2. 用户向该窗体提交凭据。
  3. 用户凭据通过 LogonUser 方法提交至 Reporting Services Web 服务。
  4. Web 服务调用客户提供的安全扩展插件,并验证相应的用户名称和密码是否存在于自定义安全机构中。
  5. 进行身份验证之后,Web 服务创建一个身份验证票证(称为“cookie”),管理票证,然后为 Web 门户的主页验证用户角色。
  6. Web 服务将此 cookie 返回至浏览器,然后在 Web 门户中显示相应的用户界面。
  7. 对用户进行身份验证之后,在 HTTP 标头中传送此 cookie 的同时浏览器向 Web 门户发出请求。 这些请求用于响应 Web 门户中的用户操作。
  8. 此 cookie 在 HTTP 标头中与请求的用户操作一起传送至 Web 服务。
  9. 对此 cookie 进行验证,如果有效,则报表服务器从报表服务器数据库中返回安全描述符及与请求的操作有关的其他信息。
  10. 如果此 cookie 有效,报表服务器将调用安全扩展插件检查用户是否有权执行特定操作。
  11. 如果用户已有相应权限,则报表服务器将执行请求的操作,并将控制权返回调用方。
  12. 用户经过身份验证后,报表服务器进行 URL 访问都会使用此 cookie。 此 cookie 在 HTTP 标头中传送。
  13. 用户继续请求对报表服务器的操作,直到会话结束为止。

如何实现

Power BI 报表服务器 引入了一个新的 Web 门户以托管新的 Odata API,并也托管新的报表工作负载,例如移动报表和 KPI。 此新门户依赖于更新的技术,并通过在单独的进程中运行与熟悉的 ReportingServicesService 分隔开来。 此进程不是 ASP.NET 托管的应用程序,因此中断了现有自定义安全扩展插件中的假设。 此外,自定义安全扩展插件的当前接口不允许传入任何外部上下文,留给实现者唯一的选择来检查熟知的全局 ASP.NET 对象,这要求对接口进行一些更改。

引入了可实现的一个新接口,此接口提供一个 IRSRequestContext,提供扩展插件用于做出与身份验证相关决定的更常见属性。

在以前的版本中,报表管理器位于前端,并且可以使用其自定义登录页面进行配置。 在 Reporting Services 2016 中,仅支持 reportserver 托管的一个页面,并且应对两个应用程序都进行身份验证。

大多数泛型示例访问 HttpContext.Current 来读取如标头和 Cookie 等请求的信息。 为了使扩展插件能够做出相同的决策,我们在提供请求信息的扩展中引入了一个新方法,并在从门户进行身份验证时调用该方法。

扩展插件必须实现 IAuthenticationExtension2 接口才能利用此方法。 扩展插件需要实现 GetUserInfo 方法的两个版本,正如 reportserver 上下文所调用的方法,以及其他在 webhost 进程中所使用的方法。 以下示例展示了此门户的一个简单实现,其中使用了 reportserver 解析的标识。

public void GetUserInfo(IRSRequestContext requestContext, out IIdentity userIdentity, out IntPtr userId)
{userIdentity = null;if (requestContext.User != null){userIdentity = requestContext.User;}// initialize a pointer to the current user id to zerouserId = IntPtr.Zero;
}

配置部署和Demo

需要实现自定义扩展认证,需要有几个步骤。在github上有一个demo https://github.com/Microsoft/Reporting-Services/tree/master/CustomSecuritySample

如果你安装demo的步骤,数据库和Power BI 服务器在一个服务器上,那么基本上很简单就搞定,我在进行测试中遇到了几个问题,给大家分享下。

1、先下载此Demo 打开后,可以进行编译,如果不能通过,可能需要添加 Microsoft.ReportingServices.Interfaces 这可以在 C:\Program Files\Microsoft Power BI Report Server\PBIRS\PowerBI 目录下找到 Microsoft.ReportingServices.Interfaces.DLL进行引用

2、对于需要对身份验证 Cookie 进行解密的窗体身份验证,需要使用相同的计算机密钥和解密算法对这两个进程进行配置。 所以我们需要生成一个强密钥和使用一些工具来生成密钥,例如 Internet Information Services 管理器 (IIS)。 在 Internet 上可以找到其他工具。

首先,使用 Visual Studio 开发人员命令提示符 来进行创建密钥

打开后,跳转到需要的目录,如cd c:\test ,然后输入: sn -k SampleKey.snk

生成的samplekey.snk需要和程序关联,点击应用程序的属性,选择签名,选择强签名密钥文件为刚生成的samplekey.snk

3、生成密钥,生成密钥理论有很多方法实现,我的这台服务器安装了IIS 我使用IIS进行生成密钥,打开IIS 选择计算机密钥。

点击后选择 验证方法AES,加密方法AES。生成的密钥记录下来备用。

4、编译项目。生成相应的文件。部署项目:

  • Copy the Logon.aspx 部署到 C:\Program Files\Microsoft Power BI Report Server\PBIRS\ReportServer 目录
  • Copy Microsoft.Samples.ReportingServices.CustomSecurity.dll and Microsoft.Samples.ReportingServices.CustomSecurity.pdb to the C:\Program Files\Microsoft Power BI Report Server\PBIRS\ \ReportServer\bin 目录
  • Copy Microsoft.Samples.ReportingServices.CustomSecurity.dll and Microsoft.Samples.ReportingServices.CustomSecurity.pdb to the C:\Program Files\Microsoft Power BI Report Server\PBIRS\ \Portal` 目录.
  • Copy Microsoft.Samples.ReportingServices.CustomSecurity.dll and Microsoft.Samples.ReportingServices.CustomSecurity.pdb to the C:\Program Files\Microsoft Power BI Report Server\PBIRS\ \PowerBI` 目录.

5、修改 C:\Program Files\Microsoft Power BI Report Server\PBIRS\ReportServer\ RSReportServer.config

  • <AuthenticationTypes> 节下修改为

    <Authentication><AuthenticationTypes> <Custom/></AuthenticationTypes><RSWindowsExtendedProtectionLevel>Off</RSWindowsExtendedProtectionLevel><RSWindowsExtendedProtectionScenario>Proxy</RSWindowsExtendedProtectionScenario><EnableAuthPersistence>true</EnableAuthPersistence>
    </Authentication>
    

在元素中找到<Security>``<Authentication>``<Extensions> 修改如下: 这里的username是管理员的名称,比如我这里设置为maxbiuser

<Security><Extension Name="Forms" Type="Microsoft.Samples.ReportingServices.CustomSecurity.Authorization, Microsoft.Samples.ReportingServices.CustomSecurity" ><Configuration><AdminConfiguration><UserName>maxbiuser</UserName></AdminConfiguration></Configuration></Extension>
</Security>
<Authentication><Extension Name="Forms" Type="Microsoft.Samples.ReportingServices.CustomSecurity.AuthenticationExtension,Microsoft.Samples.ReportingServices.CustomSecurity" />
</Authentication>

下面加入:

<MachineKey ValidationKey="[YOUR KEY]" DecryptionKey="[YOUR KEY]" Validation="AES" Decryption="AES" />

下加入,配置直通 cookie

<UI><CustomAuthenticationUI><PassThroughCookies><PassThroughCookie>sqlAuthCookie</PassThroughCookie></PassThroughCookies></CustomAuthenticationUI>
</UI>

6、修改 rssrvpolicy. config 文件

  • 需要为自定义安全扩展添加一个代码组, 该代码组将授予您的扩展的 fulltrust 权限。为此, 可以将代码组添加到 rssrvpoligy. config 文件中。

  • 打开位于目录中的 rssrvpolicy. config 文件。 C:\Program Files\Microsoft Power BI Report Server\PBIRS\ReportServer`

  • 在安全策略文件中的现有代码组之后添加以下元素, 如下所示, 然后添加一个条目, 如下所示, 以 rssrvpolicy. config。请确保根据您的 reportserver 安装目录更改以下路径:<CodeGroup>

    <CodeGroupclass="UnionCodeGroup"version="1"Name="SecurityExtensionCodeGroup" Description="Code group for the sample security extension"PermissionSetName="FullTrust">
    <IMembershipCondition class="UrlMembershipCondition"version="1"Url="C:\Program Files\Microsoft Power BI Report Server\PBIRS\ReportServer\bin\Microsoft.Samples.ReportingServices.CustomSecurity.dll"/>
    </CodeGroup>
    

7、修改报表服务器的 web. config 文件

在文本编辑器中打开 web. config 文件。默认情况下, 该文件位于目录中。 C:\Program Files\Microsoft Power BI Report Server\PBIRS\ReportServer`

  • 找到该元素, 并将 “模拟” 属性设置为 false。<identity>

    <identity impersonate="false" />
    
  • 找到该元素, 并将 mode 属性更改为窗体。此外, 将以下元素添加为元素的子元素, 并设置 loginurl、名称、超时和路径属性, 如下所示:<authentication>``<forms>``<authentication>

    <authentication mode="Forms"><forms loginUrl="logon.aspx" name="sqlAuthCookie" timeout="60" path="/"></forms>
    </authentication>
    
  • 直接在元素之后添加以下元素。<authorization>``<authentication>

    <authorization>
    <deny users="?" />
    </authorization>
    

这将拒绝未经身份验证的用户访问报表服务器的权限。该元素以前建立的 loginurl 属性将未经身份验证的请求重定向到 logon. aspx 页。

8、使用CustomSecuritySample\Setup下面 CreateUserStore.sql 创建用户表

排错

部署完成后,重启Power BI 服务器服务。访问我的报表地址是81端口:http://maxtestweb:81/Reports

会跳转到 http://maxtestweb:81/ReportServer/logon.aspx?ReturnUrl=/ReportServer/localredirect?url=%2freports

但是我在访问的时候报错,出现500错误什么的,检查完成一遍后,还是报错。 检查日志发现:

runtimeBroker没有权限。 打开注册表,找到appid,然后右键权限,将所有者改为管理员。



然后使用组件服务,找到 runtimeBroker,点击属性 权限添加相应的用户权限。


重启服务器,然后刷新,看到登录界面。终于看到了希望。点击注册用户,报告无法链接到数据库服务器。

代码里面AuthenticationUtilities.cs可以看到:

sqlconnection使用的参数是:Properties.Settings.Default.Database_ConnectionString 这诡异的地方。这里自己改到仔细的数据库服务器。

改完后登录后的效果。

总结

以上方法实现了自定义认证,因为可以自定义了既可以实现各种验证方法,比如多因子。过程看起来比较繁琐,还是比较容易实现的。AuthenticationUtilities.cs和login.cs可以实现更多的内容。

有问题大家一起谈谈

作者简介: Max Shen(阿特),为了成为数据专家而努力,万一实现了呢!有多年的系统运维,数据库运维经验。近20年的IT从业经验,在微软有超过10年的工作经验。对数据库运维调优,排错,有独到能力。电话微信18628037379,maxcloud@outlook.com

纵有倚天剑还要屠龙刀,实现Power BI报表服务器自定义认证相关推荐

  1. 安装 Power BI 报表服务器

    开始之前 建议在安装 Power BI 报表服务器之前先查看安装 Power BI 报表服务器所要满足的硬件和软件要求. Power BI 报表服务器产品密钥 Power BI Premium 如果已 ...

  2. Power BI 报表服务器企业一站式全链路解决方案

    Power BI 报表服务器企业一站式全链路解决方案 (单点登录,自定义报表门户,自定义权限,应用集成) 前言 Power BI 从诞生开始就成为耀眼的明星,有着几大优势 1.快速上手 2.简单明了 ...

  3. 微软Power BI报表服务器学习总览

    今天,微软宣布了8月更新Power BI Report Server!此版本包含一些新功能,包括一些备受期待的项目,如报表主题,条件格式改进和报表页面工具提示. 报告 报告主题 用于触发操作的按钮 组 ...

  4. power bi报表服务器_如何将Power BI Report Server报表嵌入ASP.Net Web应用程序

    power bi报表服务器 Every once in a while, teams from different functional areas of the business (i.e. bus ...

  5. 报表服务器组件,开发者手册概述:Power BI 报表服务器

    开发者手册概述:Power BI 报表服务器 11/01/2017 本文内容 欢迎阅读 Power BI 报表服务器的开发者手册.Power BI 报表服务器是用于存储和管理 Power BI 报表. ...

  6. powerbi无法将修改保存到服务器,对 Power BI 报表服务器中的计划刷新进行故障排除...

    对 Power BI 报表服务器中的计划刷新进行故障排除 11/01/2017 本文内容 本文将讨论可用于解决 Power BI 报表服务器中计划刷新问题的资源. 对于后续出现的问题,本文将进行信息更 ...

  7. powerbi服务器性能分配,Power BI 报表服务器容量计划指南

    Power BI 报表服务器容量计划指南 04/02/2020 本文内容 Power BI 报表服务器是自助式 BI 和企业报表解决方案,客户可以在本地(防火墙后)进行部署. 它将 Power BI ...

  8. 在 SharePoint Server 中使用 iFrame 嵌入“Power BI 报表服务器”报表

    在本快速入门中,你将了解如何通过在 SharePoint 页面中使用 iFrame 嵌入 Power BI 报表服务器报表. 如果正在使用 SharePoint Online,则必须可以公开访问 Po ...

  9. 汇编在嵌入式编程中的作用_如何在嵌入式Power BI报表中以编程方式传递凭据

    汇编在嵌入式编程中的作用 In the article, How to embed a Power BI Report Server report into an ASP.Net web applic ...

最新文章

  1. JS数字转换成货币格式
  2. wifi四次握手过程
  3. 竞品分析框架及案例-探索业务方向
  4. Java黑皮书课后题第6章:**6.22(数学:平方根的近似求法)实现Math类中dsqrt方法的技术:巴比伦法nextGuess = (lastGuess + n / lastGuess) / 2
  5. linux rar命令没找到,Linux没有rar解压命令
  6. oracle10g 如何打开,oracle10g  oem无法打开解决方法
  7. 【SQL练习题】1. 多列数据求最大值
  8. NLP(三) 预处理
  9. Linux中关机与重启命令
  10. beanstalkd最佳实践-编程开发
  11. idea启动日志在哪里_艹,我的日志被Intellij IDEA 控制台给“吃”了!
  12. 数字电路与系统设计(一)
  13. 电源系列3:DCDC BUCK降压电路原理
  14. 软件项目管理 --SVN目录结构
  15. 英语学习APP案例分析
  16. 动画必须有(二):悬浮菜单了解一下!
  17. java file.length 单位_Java File length()方法
  18. sysprep无法验证你的windows安装_Sysprep无法验证你的windows 安装。
  19. Ajax入门-搭建服务器并使用ajax技术向服务器发送一个请求并获得服务器返回的数据
  20. 只学2个月编程能写出什么代码?

热门文章

  1. AM5728通过GPMC接口与FPGA高速数据通信实现
  2. 2017 多校联合训练 3 题解
  3. mysql function DATE_FORMA T(date, format)
  4. Field+offset(len)
  5. C#操作config文件
  6. jQuery重置表单2
  7. 测试一下Windows Live Writer能否正常使用。
  8. Log4Net使用手册
  9. Python常用模块集锦
  10. 关于解决Python中requests模块在PyCharm工具中导入问题