安全扩展插件示例

更新日期: 2005 年 12 月 5 日

CustomSecurity 安全扩展插件示例使用 SQL Server 自带的窗体身份验证提供自定义的安全模式,此模式可以与 Reporting Services 协同工作。基于 Itanium 的操作系统不支持该示例。

安装期间不会自动安装 SQL Server 示例。有关如何安装示例的说明,请参阅安装示例

ms160724.security(zh-cn,SQL.90).gif安全说明:
安全扩展插件示例不应在生产环境中部署和测试。通常,建议不要在迁移到其他安全扩展插件之后恢复到 Windows 身份验证。如果这样做,则在尝试访问报表服务器数据库中具有自定义安全描述符但没有 Windows 身份验证安全描述符的项时,可能会出错。若要进行恢复,您必须重新安装 Reporting Services 并手动为 Windows 用户重新应用所有基于角色的安全性。在使用此示例前,应备份配置文件。
ms160724.note(zh-cn,SQL.90).gif重要提示:
提供的示例仅供教学使用。这些示例不是针对生产环境设计的,也没有在生产环境中进行测试。对于这些示例,Microsoft 不提供相关的技术支持。未经系统管理员许可,不能将示例应用程序和程序集与生产 SQL Server 数据库或报表服务器相连接或一起使用。

要求

您应该熟悉 Visual Studio 以及 Visual C# 或 Visual Basic,并且还应安装以下应用程序,才能运行 CustomSecurity 示例:

  • Microsoft Visual Studio 2005 或兼容开发环境(用于查看项目文件)。
  • Microsoft .NET Framework 2.0 版。
  • SQL Server 2005,包括 Reporting Services。
  • Reporting Services 示例。
  • 如果您计划使用示例扩展插件来将其他数据处理功能添加到服务器,还需要安装一个报表服务器,您应具通过网络访问该报表服务器的权限。

位置

默认情况下,此示例位于 Reporting Services 示例目录的 Extension Samples\FormsAuthentication Sample 子目录中。

C:\Program Files\Microsoft SQL Server\90\Samples\Reporting Services\Extension Samples\FormsAuthentication Sample

生成示例

必须先编译和安装扩展插件。假定在执行此过程时已经把 Reporting Services 安装在默认位置:C:\Program Files\Microsoft SQL Server\MSSQL.3\Reporting Services。该位置在本主题的以下部分中简称为 <安装位置>。

如果尚未创建强名称密钥文件,则请使用以下说明生成该密钥文件。

生成强名称密钥文件

  1. 打开 Microsoft Visual Studio 2005 命令提示符。单击“开始”,依次指向“所有程序”、“Microsoft .NET Framework SDK 2.0”,然后单击“SDK 命令提示符”

    - 或 -

    打开 Microsoft .NET Framework 命令提示符。单击“开始”,依次指向“所有程序”、“Microsoft .NET Framework SDK 2.0”,然后单击“SDK 命令提示符”

  2. 使用更改目录命令 (CD) 将命令提示符窗口的当前目录更改至安装示例的文件夹。

    ms160724.note(zh-cn,SQL.90).gif注意:
    若要确定示例所在的文件夹,请单击“开始”按钮,依次指向“所有程序”、“Microsoft SQL Server”、“文档和教程”,然后单击“示例目录”。如果使用了默认安装位置,则示例将位于 <system_drive>:\Program Files\Microsoft SQL Server\100\Samples 中。
  3. 在命令提示符下,运行以下命令以生成密钥文件:

    sn -k SampleKey.snk

    ms160724.note(zh-cn,SQL.90).gif重要事项:
    有关强名称密钥对的详细信息,请参阅 MSDN 上 .NET 开发中心中的“安全简讯:.NET Framework 中的强名称和安全性”。

使用 Visual Studio 2005 编译示例

  1. 在 Microsoft Visual Studio 2005 中打开 CustomSecurity.sln。如果已经将该示例安装在默认位置,便可以在 C:\Program Files\Microsoft SQL Server\MSSQL\Reporting Services\Samples\Extensions 中访问此示例。

  2. 在解决方案资源管理器中,选择 CustomSecurity 项目。

  3. 在**“项目”菜单上,单击“添加引用”**。

    此时,将打开**“添加引用”**对话框。

  4. 单击 .NET 选项卡。

  5. 单击**“浏览”,在本地驱动器上查找 Microsoft.ReportingServices.Interfaces。默认情况下,程序集位于 <安装位置>\ReportServer\bin 目录中。单击“确定”**。

    所选引用将添加到项目中。

  6. 在**“生成”菜单上,单击“生成解决方案”**。

部署示例

示例编译完成后,必须将 DLL 和 ASPX 页复制到安装报表服务器的相应子目录中。

部署示例

  1. 将 Microsoft.Samples.ReportingServices.CustomSecurity.dll 和 Microsoft.Samples.ReportingServices.CustomSecurity.pdb 复制到 <安装位置>\ReportServer\bin 目录。

  2. 将 Microsoft.Samples.ReportingServices.CustomSecurity.dll 和 Microsoft.Samples.ReportingServices.CustomSecurity.pdb 复制到 <安装位置>\ReportManager\bin 目录。

  3. 将 Logon.aspx 页复制到 <安装位置>\ReportServer 目录,并将 UILogon.aspx 页复制到 <安装位置>\ReportManager\Pages 目录。

将程序集和登录页复制到服务器上之后,需要对报表服务器和报表管理器配置文件做一些修改。

ms160724.note(zh-cn,SQL.90).gif重要提示:
请在进行任何更改之前对所有配置文件进行备份。

修改 RSReportServer.config 文件

  1. 使用 Visual Studio 2005 或简单的文本编辑器(如记事本)打开 RSReportServer.config 文件。RSReportServer.config 位于 <安装位置>\ReportServer 目录中。

  2. 找到 <Security> 和 <Authentication> 元素,并对该设置进行如下修改:

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

    有关 .NET Framework 安全性和 Reporting Services 的详细信息,请参阅Understanding Code Access Security in Reporting Services

修改 RSWebApplication.config 文件

  1. 接着,需要打开位于 <安装位置>\ReportManager 目录的报表管理器配置文件 RSWebApplication.config。

  2. 找到 <UI> 元素,对其进行如下更新:

    <UI>
       <CustomAuthenticationUI>
          <loginUrl>/Pages/UILogon.aspx</loginUrl>
             <UseSSL>True</UseSSL>
       </CustomAuthenticationUI>
       <ReportServerUrl>http://<server>/ReportServer</ReportServerUrl>
    </UI>
    
ms160724.note(zh-cn,SQL.90).gif注意:
如果运行安全扩展插件示例的开发环境中没有安装安全套接字层 (SSL) 证书,则必须在上述配置条目中将 <UseSSL> 元素的值改为 False。建议将 Reporting Services 与窗体身份验证结合使用时始终使用 SSL。

您将需要为自定义安全扩展插件添加代码组,以便为扩展插件授予 FullTrust 权限。此操作可通过向 rssrvpolicy.config 文件中添加代码组来实现。

修改 RSSrvPolicy.config 文件

  1. 打开位于 <安装位置>\ReportServer 目录中的 rssrvpolicy.config 文件。

  2. 在安全策略文件中找到具有 $CodeGen URL 成员身份的现有代码组(如下所示),然后按照如下所示向 rssrvpolicy.config 添加条目。

    ms160724.note(zh-cn,SQL.90).gif注意:
    如果已安装 Analysis Services,则需要将 Url="C:\Program Files\Microsoft SQL Server\MSSQL.2\Reporting Services\ReportServer\bin\Microsoft.Samples.ReportingServices.CustomSecurity.dll 改为 MSSQL.3
    <CodeGroup
       class="UnionCodeGroup"
       version="1"
       PermissionSetName="FullTrust">
       <IMembershipCondition 
          class="UrlMembershipCondition"
          version="1"
          Url="$CodeGen$/*"
       />
    </CodeGroup>
    <CodeGroup
       class="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 SQL Server\MSSQL.2\Reporting Services\ReportServer\bin\Microsoft.Samples.ReportingServices.CustomSecurity.dll"
       />
    </CodeGroup>
    
ms160724.note(zh-cn,SQL.90).gif注意:
为了简化起见,在安全策略文件中窗体身份验证示例使用弱名称,并且只需要简单的 URL 成员身份条目。在生产安全扩展插件的实施过程中,当为程序集添加安全性策略时,应创建具有强名称的程序集,并使用强名称成员身份条件。有关具有强名称的程序集的详细信息,请参阅 MSDN 中的“创建和使用具有强名称的程序集”主题。

接着,需要在报表管理器策略文件中提高“My Computer”代码组的权限。

修改 RSMgrPolicy.config 文件

  1. 打开位于 <安装位置>\ReportManager 目录中的报表管理器策略文件 rsmgrpolicy.config。

  2. 在 rsmgrpolicy.config 中找到以下代码组,并按照如下所示将 PermissionSetName 属性由 Execution 改为 FullTrust

    <CodeGroup 
            class="FirstMatchCodeGroup" 
            version="1" 
            PermissionSetName="FullTrust"
            Description="This code group grants MyComputer code Execution 
    permission. ">
        <IMembershipCondition 
                class="ZoneMembershipCondition"
                version="1"
                Zone="MyComputer" />
    

为了使用窗体身份验证,需要修改报表管理器和报表服务器的 Web.config 文件,以更改身份验证模式并禁用模拟。

修改报表服务器的 Web.config 文件

  1. 在文本编辑器中打开 Web.config 文件。默认情况下,此文件位于 <安装位置>\ReportServer 目录中。

  2. 找到 <identity> 元素并将 Impersonate 属性设置为 false

    <identity impersonate="false" />
    
  3. 找到 <authentication> 元素并将 Mode 属性改为 Forms

  4. 将以下 <forms> 元素添加为 <authentication> 元素的子元素,并按如下所示设置 loginUrlnametimeoutpath 属性:

    <authentication mode="Forms">
       <forms loginUrl="logon.aspx" name="sqlAuthCookie" timeout="60" 
                   path="/"></forms>
       </authentication>
    
  5. 将以下 <authorization> 元素直接添加到 authentication> 元素的后面。

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

    这将拒绝未授权的用户对报表服务器的访问。前面建立的 <authentication> 元素的 loginUrl 属性将重定向对 Logon.aspx 页的未经身份验证的请求。

修改报表管理器的 Web.config 文件

  1. 打开报表管理器的 Web.config。它位于 <安装位置>\ReportManager 目录中。

  2. 查找 <identity impersonate= "true" /> 部分并将其改为 <identity impersonate="false" />,以禁用模拟。

配置匿名身份验证

默认情况下,Windows 用户组 Guests 包括 IUSR_computername 帐户。此帐户用于最初的本地登录和查看 Logon.aspx 页。若要支持窗体身份验证,必须启用对 ReportServer 虚拟目录的匿名访问。默认情况下,匿名访问是禁用的。

启用匿名身份验证

  1. 在**“Internet 信息服务”中,选择 ReportServer 虚拟目录(通常是默认网站的一个成员),然后打开其“属性”**选项卡。

  2. 单击**“目录安全性”**选项卡。

  3. 在**“匿名访问和验证控制”区域,单击“编辑”**。

    将出现**“验证方法”**对话框。

  4. 选中**“匿名访问”**复选框。

  5. 单击**“确定”**。

    对于 Reports 虚拟目录,重复以上步骤。

创建 UserAccounts 数据库

示例包括一个数据库脚本 createuserstore.sql,使用它可以在 SQL Server 数据库中为 Forms 示例建立一个用户存储。

创建 UserAccounts 数据库

  1. 打开 SQL Server Management Studio,再连接到 SQL Server 的本地实例。

  2. 找到 createuserstore.sql SQL 脚本文件。此脚本文件包含在示例项目文件中。

  3. 在整个脚本中搜索“LocalMachine”,然后用自己的计算机名进行替换。对于 Windows 2003 用户,请用 NT AUTHORITY\NETWORK SERVICE 替换 LocalMachine\ASPNET(处于 IIS 5 兼容模式时例外)。

  4. 运行查询,创建 UserAccounts 数据库。

  5. 退出 SQL Server Management Studio。

测试示例

以下为测试示例扩展插件的步骤。注册一个管理员用户,在 UserAccounts 数据库的用户表中添加用户名、密码哈希和 salt 值。在报表服务器配置文件中也需要输入此用户名。然后以相同的用户身份登录,以确保密码验证例程的操作和报表服务器上扩展插件程序集的加载均正确。

创建报表项目

  1. 在命令提示符下运行 Iisreset.exe 来重新启动 IIS。

  2. 打开报表管理器。您可以通过 Reporting Services 程序菜单来执行此操作,也可以通过浏览器访问 Reports 虚拟目录的方法来执行。

  3. 输入用户名和密码,然后单击**“注册用户”,向帐户**数据库中添加用户。

  4. 打开 RSReportServer.config 文件。找到 <Security> 元素,并按照如下所示添加之前注册的用户名:

    <Security>
       <Extension Name="Forms" 
    Type="Microsoft.Samples.ReportingServices.CustomSecurity.Authorization, 
    Microsoft.Samples.ReportingServices.CustomSecurity" >
          <Configuration>
             <AdminConfiguration>
                <UserName>username</UserName>
             </AdminConfiguration>
          </Configuration>
       </Extension>
    </Security>
    
  5. 返回到 UILogon.aspx 页,重新输入用户名和密码,然后单击**“登录”**。

此时访问报表管理器和报表服务器应不会再受到限制。您所创建的管理员用户和本地计算机上内置的管理员帐户对报表服务器具有同等的权限。在此示例中,只能指定一个用户作为管理员用户。拥有内置管理员帐户以后,便可以注册其他用户,在报表服务器上为他们指定角色。

ms160724.note(zh-cn,SQL.90).gif注意:
应将管理员用户添加到报表服务器的正式的系统管理员和内容管理员(根文件夹)角色。这可以避免当前在报表服务器数据库中出现空的安全描述符。有关系统管理员和内容管理员角色的详细信息,请参阅预定义角色概述

使用具有自定义安全性的 Web 服务

您可以将 Web 服务 API 与窗体身份验证一起使用,就像与 Windows 身份验证一起使用一样。但是,必须在 Web 服务代码中调用 LogonUser,传递当前用户的凭据。另外,您的 Web 服务客户端将不会具有自动 cookie 管理(由 Internet Explorer 或其他 Web 浏览器提供)的优点。您必须扩展 Microsoft.ReportingServices 代理类以将 cookie 管理包括在内。这可以通过覆盖 Web 服务类的 GetWebRequestGetWebResponse 方法来完成。

调试示例扩展插件

在调试器中运行示例扩展插件不仅是对可能遇到的问题进行故障排除的好方法,也是当此类问题出现时单步执行代码和查看报表服务器身份验证和身份验证过程的有效方法。

Microsoft .NET Framework 提供了一些可以帮助分析示例代码的调试工具。以下过程将使用 Visual Studio 2005 来调试上述示例。

调试窗体身份验证示例代码

  1. 启动 Visual Studio,并在测试报表服务器上打开 CustomSecurity.sln。

  2. 打开 Internet Explorer 并定位至报表管理器,同时在 Visual Studio 中将此示例代码保持为打开。

  3. 切换至 Visual Studio,在自定义安全扩展插件项目代码中设置一些断点。

  4. 在扩展插件项目的窗口仍然保持活动状态的同时,在**“调试”菜单上,单击“进程”**。

    **“进程”**对话框打开。

  5. 从进程列表中,选择 Aspnet_wp.exe 进程(如果应用程序是在 IIS 6.0 中部署的,请选择 W3wp.exe),然后单击**“附加”**。

  6. 在**“附加到进程”对话框中,选择“公共语言运行时”程序类型,然后单击“确定”**。为了获得更高的调试性能,请确保不要选中 Native 程序类型。

  7. 示例在运行时将显示一个登录窗体。在登录窗体中键入用户凭据,然后单击**“登录”**按钮。

    无论在处理过程中何时遇到断点,调试器都应在该点停止执行。

  8. 使用 F11 键单步执行代码。有关使用 Visual Studio 进行调试的详细信息,请参阅 Visual Studio 2005 文档。

ms160724.note(zh-cn,SQL.90).gif注意:
这种调试方式需要大量资源和处理器时间。如果运行过程中出现问题,请关闭 Visual Studio、重新启动 IIS,然后将 CustomSecurity 解决方案附加到 ASP.NET 辅助进程并登录报表管理器,重新开始调试。

删除示例扩展插件

虽然通常情况下不建议这样做,但体验过示例之后是可以恢复到 Windows 身份验证的。

恢复到 Windows 安全性

  1. 从备份副本中还原下列文件:Web.config、RSReportServer.config 和 RSWebApplication.config。此操作将把报表服务器的身份验证方法和授权方法设置为默认的 Windows 安全性。还将删除在报表服务器或报表管理器配置文件中为扩展插件创建的所有条目。

  2. 在 Internet 信息服务 (IIS) 中禁用对报表服务器虚拟目录的匿名访问。

配置信息删除之后,您的安全扩展插件对于报表服务器将不再可用。您不必删除在示例安全扩展插件下运行报表服务器时创建的任何安全描述符。Windows 身份验证启用后,此报表服务器将自动为报表服务器的宿主计算机上的 BUILTIN\Administrators 组分配系统管理员角色。但是,您必须手动为 Windows 用户重新应用所有基于角色的安全性。

注意,通常建议不要在迁移到其他安全扩展插件之后恢复到 Windows 身份验证。如果这样做,则在尝试访问报表服务器数据库中具有自定义安全描述符但没有 Windows 身份验证安全描述符的项时,可能会出错。

请参阅

任务

SQL Server Reporting Services 示例

其他资源

扩展插件示例 (Reporting Services)
Implementing a Security Extension

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

发布日期 历史记录

2005 年 12 月 5 日

更改的内容:
  • 更改了有关生成密钥文件的说明,包括密钥文件的名称和位置。