[收藏]使用Reporting Services中的窗体身份验证-数据库专栏,SQL Server

24 篇文章 0 订阅
4 篇文章 0 订阅
使用 reporting services 中的窗体身份验证发布日期: 8/18/2004 | 更新日期: 8/18/2004
microsoft corporation

适用范围:
microsoft® sql server™ 2000 reporting services

摘要:了解有关 reporting services 安全扩展方面的知识,着重学习窗体身份验证。此外,下载和部署 reporting services 的窗体身份验证扩展示例。

要安装示例代码,请下载 forms authentication sample installer,并在电脑上运行他。
本页内容引言关于本指南reporting services 平台窗体身份验证示例结论参考资料引言
部署安全的分布式企业报告解决方案是个极具挑战性的过程。从报告访问到提供重要数据(有时是敏感数据)的数据源,您需要针对如何在报告环境中对用户进行安全的身份验证和授权作出决策。在安全面,报告是报告链中最薄弱的环节。

所需的安全类型取决于报告环境和已安装的安全系统类型。microsoft® windows® authentication 是用于确保 microsoft® sql server™ 2000 reporting services 中的报告安全性的主要系统。windows authentication 提供和其他 microsoft 服务器产品的紧密集成,由于 reporting services 是在 windows authentication 上设计和测试的,因此他在这个环境中的安全性最高。

然而,在某些情况下,可能需要对 reporting services 安全系统进行扩展,以满足企业自定义安全的需要。您能够通过功能丰富的 reporting services api 研发平台达到这一目的。本指南将概述 reporting services 中的扩展,尤其是安全扩展。您还能够下载适用于 reporting services 的示例窗体身份验证扩展,并对他进行深入研究。随后,您能够利用 reporting services 安全扩展将自定义安全添加到企业报告解决方案中。
返回页首关于本指南
本指南中提供的信息旨在:

向您介绍 reporting services 安全扩展。

确定在 reporting services 中使用自定义身份验证和授权的位置和方式。

介绍身份验证和授权在 reporting services 中的工作方式。

介绍窗体身份验证及其实现方式。

为您提供了一个能够下载和研究的窗体身份验证示例。
必备知识
本指南未介绍 asp.net 安全或窗体身份验证,未提供有关编程或应用程式安全的深层次知识。作为一名期望为 reporting services 实现安全扩展的研发人员,您应该对以下一个或多个方面有着深入的了解:

microsoft reporting services 功能,尤其是身份验证、授权和基于角色的安全。

microsoft .net framework。

asp.net 和 asp.net 安全。

窗体身份验证。

.net 语言方面的研发经历。本文仅提供用 c# 编写的示例。

要直接了解代码,能够转到“窗体身份验证示例”部分。但是,您可能会发现前面的几部分很有帮助,这些部分介绍了您将使用的某些技术连同如何将这些技术组合在一起使用。
返回页首reporting services 平台
通过 reporting services,可在整个企业中设计、部署和交付报告。从研发人员的角度来看,reporting services 通过 .net framework 和 web service 的关键研发平台提供了各种编程机会。reporting services 能够通过“随手可用”的方式进行部署,从而能够在任何公司中提供全面的报告解决方案。然而,reporting services 的开放式和可扩展编程体系结构使他已不再是个现成的产品,而更像是研发人员连同最终用户的报告平台。
扩展 reporting services
reporting services 具备可扩展性。通过托管代码 api,能够研发、安装和管理许多 reporting services 组件使用的扩展。能够使用 .net framework 创建专用或共享的程式集,并添加新的 reporting services 功能以满足日益增长的业务需求。研发人员可通过以下方式扩展 reporting services:

除了 reporting services 当前附带的 microsoft sql server、oracle 和 ole db 提供程式以外,创建其他数据处理扩展。数据处理扩展可用于从您自己特有的数据源中读取数据,并可用于在创建和筛选数据集时并入其他业务逻辑。

除了 reporting services 当前附带的电子邮件和文档共享交付扩展以外,创建其他交付扩展。交付扩展可用于向传真机、寻呼机、打印机等设备交付报告。

除 reporting services 已附带的呈现扩展之外,创建其他呈现扩展。

除了 windows authentication 扩展(他当前是该产品的默认安全机制)之外,创建其他安全扩展。

如前所述,本指南主要介绍了如何通过窗体身份验证扩展 reporting services 的安全系统。
安全扩展
通过 reporting services 安全扩展,能够对用户或组进行身份验证和授权,即他使不同的用户能够登录到报告服务器,并根据他们的身份执行不同的任务或操作。默认情况下,reporting services 使用基于 windows 的身份验证扩展,该身份验证扩展使用 windows 帐户协议验证声称拥有该系统帐户的用户的身份。reporting services 使用基于角色的安全系统对用户进行授权。reporting services 基于角色的安全模式类似于其他技术的基于角色的安全模式。由于安全扩展基于开放式、可扩展的 api,因此能够在 reporting services 中创建新身份验证和授权扩展。以下是使用基于窗体的身份验证和授权的安全扩展实现的典型示例:


图 1如图所示,身份验证和授权按如下过程进行:

1.

用户尝试通过输入 url 来访问 report manager,然后被重定向到一个为客户端应用程式收集用户凭据的窗体。

2.

该用户将凭据提交给窗体。

3.

通过 logonuser 方法将该用户的凭据提交给 reporting services web service。

4.

web service 调用客户提供的安全扩展,并验证自定义安全机构中是否存在该用户名和密码。

5.

进行身份验证时,web service 将创建身份验证票据(称作“cookie”),管理该票据,并验证该用户的角色能否访问 report manager 的主页。

6.

web service 将 cookie 返回给浏览器,并在 report manager 中显示相应的用户界面。

7.

身份验证结束后,浏览器向 report manager 发出请求,同时在 http 标头中传输此 cookie。这些请求是为响应 report manager 应用程式中的用户操作而发出的。

8.

该 cookie 连同请求的用户操作在 http 标头中一起被传输到 web service。

9.

cookie 将接受验证,假如他有效,报告服务器将从报告服务器数据库中返回和请求操作相关的安全描述符和其他信息。

10.

假如 cookie 有效,报告服务器将调用安全扩展,以检查该用户是否有权执行特定的操作。

11.

假如该用户已被授权,报告服务器将执行请求的操作,并将控制返回给调用方。

12.

该用户经过身份验证后,对报告服务器的 url 访问将使用相同的 cookie。该 cookie 在 http 标头中传输。

13.

用户继续在报告服务器上请求操作,直至会话结束。
何时实现安全扩展
microsoft 建议您尽可能地使用 windows authentication。但是,但在以下两种情况下,应使用 reporting services 的自定义身份验证和授权:

internet 或 extranet 应用程式未使用或无法使用 windows 帐户。

您具备自定义的用户和角色,并且需要在 reporting services 中提供匹配的授权方案。
安全扩展 api
下表列出了安全扩展的可用接口和类。
接口或类说明
iauthenticationextension 接口

表示 reporting services 中的身份验证扩展,使您能够实现可用于用户身份验证(使用自定义身份验证方案)的安全扩展类。

iauthorizationextension 接口

表示可用于扩展 reporting services 的授权功能的扩展,使您能够实现可用于授权用户执行操作的安全扩展类。

iextension 接口

表示 reporting services 中的扩展。

acecollection 类

表示指定一个或多个受信任者的访问权限的访问控制项的集合。

acestruct 类

受信任者(用户、组或电脑)的访问控制项,用于指定受信者能够对报告服务器数据库中的项目执行的操作。

catalogoperationscollection 类

表示目录操作集合。

datasourceoperationscollection 类

表示数据源操作集合。

folderoperationscollection 类

表示文档夹操作集合。

operationnames 类

包含用户能够对 reporting services 中的项目执行的操作的字段名和相应值。

reportoperationscollection 类

表示报告操作集合。

resourceoperationscollection 类

表示资源操作集合。

有关安全扩展 api 的各种接口和类的周详信息,请参阅 reporting services 联机丛书。
reporting services 中的身份验证
身份验证是建立用户身份权限的过程。有许多方法可用于用户身份验证。最常用的方法是使用密码。实现窗体身份验证时,应使用这样的实现:请求用户提供凭据(一般通过需要输入登录名和密码的某种界面),然后根据用户存储(例如,数据库表或配置文档)验证用户。假如凭据无法得到验证,身份验证进程将失败,用户将获取匿名身份。

在 reporting services 中,windows 操作系统通过集成的安全性或通过用户凭据的显式接收和验证来处理用户的身份验证。可对 reporting services 中的自定义身份验证进行研发,使之支持其他身份验证方案。为此,可使用安全扩展接口 iauthenticationextension。任何扩展都继承于 iextension,他是报告服务器部署和使用的任何扩展的基本接口。iextension 和 iauthenticationextension 是 microsoft.reportingservices.interfaces 命名空间的成员。

logonuser 方法是 reporting services 中任何身份验证的核心。可使用他将用户凭据传递给报告服务器进行验证。基础安全扩展实现包含自定义身份验证代码的 iauthenticationextension.logonuser。在窗体身份验证示例(将在本指南后面部分介绍)中,logonuser 根据提供的凭据和数据库中的自定义用户存储区执行身份验证检查。在窗体身份验证示例中,他类似于以下过程:

在 authenticationextension.cs(窗体身份验证示例)中

public bool logonuser(string username, string password, string authority){ return authenticationutilities.verifypassword(username, password);}

在 authenticationutilities.cs(窗体身份验证示例)中

internal static bool verifypassword(string suppliedusername, string suppliedpassword){ bool passwordmatch = false; // 基于用户名从数据库中获取 salt 和密码。 // 请参阅“how to:use dpapi (machine store) from asp.net”、“how to: // use dpapi (user store) from enterprise services”和“how to: // create a dpapi library”,以了解有关如何使用 // dpapi 安全地存储连接字符串的周详信息。 sqlconnection conn = new sqlconnection( "server=localhost;" + "integrated security=sspi;" + "database=useraccounts"); sqlcommand cmd = new sqlcommand("lookupuser", conn); cmd.commandtype = commandtype.storedprocedure; sqlparameter sqlparam = cmd.parameters.add("@username", sqldbtype.varchar, 255); sqlparam.value = suppliedusername; try { conn.open(); sqldatareader reader = cmd.executereader(); reader.read(); // 跳转到唯一行 // 从返回的数据流返回输出参数 string dbpasswordhash = reader.getstring(0); string salt = reader.getstring(1); reader.close(); // 现在采用用户输入的 salt 和密码 // 并将他们串联在一起。 string passwordandsalt = string.concat(suppliedpassword, salt); // 现在对他们进行哈希操作 string hashedpasswordandsalt = formsauthentication.hashpasswordforstoringinconfigfile( passwordandsalt, "sha1"); // 现在验证他们。假如他们相等,则返回 true passwordmatch = hashedpasswordandsalt.equals(dbpasswordhash); } catch (exception ex) { throw new exception("exception verifying password. " + ex.message); } finally { conn.close(); } return passwordmatch;}
身份验证流程
reporting services web service 提供自定义身份验证,以便 report manager 和报告服务器能够进行窗体身份验证。

reporting services web service 的 logonuser 方法用于将凭据提交给报告服务器,以进行身份验证。web service 使用 http 标头将身份验证票据(称为“cookie”)从服务器传递到客户端,以响应已验证的登录请求。

下图描述了当使用配置为使用自定义身份验证扩展的报告服务器来部署您的应用程式时,对要访问 web service 的用户进行身份验证的方法。


图 2如图 2 所示,身份验证进程如下:

1.

客户端应用程式调用 web service 方法 logonuser 对用户进行身份验证。

2.

web service 调用安全扩展(具体而言,是指实现 iauthenticationextension 的类)的 logonuser 方法。

3.

logonuser 的实现验证用户存储或安全机构中的用户名和密码。

4.

身份验证成功后,web service 将创建 cookie 并针对会话对其进行管理。

5.

web service 通过 http 标头将身份验证票据返回给调用的应用程式。

web service 通过安全扩展成功对用户进行身份验证后,将生成一个 cookie,用于随后的请求。由于报告服务器没有安全机构,因此该 cookie 不会一直保存在自定义安全机构中。cookie 从 web service 方法 logonuser 返回,并用于随后的 web service 方法调用连同 url 访问。

安全:为了避免在传输过程中泄露 cookie,应使用安全套接字层 (ssl) 加密安全地传输从 logonuser 返回的 cookie。

假如在安装了自定义安全扩展的情况下通过 url 访问来访问报告服务器,则 internet 信息服务 (iis) 和 asp.net 将自动管理身份验证票据的传输。假如通过 soap api 访问报告服务器,则代理类的实现必须包含对身份验证票据管理的附加支持。有关使用 soap api 和管理身份验证票据的周详信息,请参阅本指南后面的“将 web service 用于自定义安全”。
reporting services 中的身份验证
授权是指决定是否为某一身份授予请求类型的访问权限(访问报告服务器数据库中的给定资源的权限)的过程。reporting services 使用基于角色的授权体系结构,即,基于应用程式中的用户角色授予用户访问给定资源的权限。reporting services 的安全扩展包含授权组件(一旦用户在报告服务器上得到验证,该授权组件便用于授予用户权限)的实现。当用户试图通过 soap api 和通过 url 访问对系统或报告服务器项目执行操作时,授权便被调用。为此,能够使用安全扩展接口 iauthorizationextension。如前所述,任何扩展都继承于 iextension,他是部署的任何扩展的基本接口。iextension 和 iauthorizationextension 是 microsoft.reportingservices.interfaces 命名空间的成员。

在授权中,任何自定义安全实现的关键是访问权检查,该检查在方法 checkaccess 中进行。每当用户试图在报告服务器上进行操作时,checkaccess 便会被调用。checkaccess 方法将针对每种操作类型进行重载。对于文档夹操作,访问权检查的示例可能如下所示:

// 针对文档夹操作重载public bool checkaccess( string username, intptr usertoken, byte[] secdesc, folderoperation requiredoperation){ // 假如用户是管理员,则允许无限制访问。 if (username == m_adminusername) return true; acecollection acl = deserializeacl(secdesc); foreach(acestruct ace in acl) { if (username == ace.principalname) { foreach(folderoperation acloperation in ace.folderoperations) { if (acloperation == requiredoperation) return true; } } } return false;}

报告服务器通过传入登录用户的名称、用户令牌、操作项目的安全描述符和请求的操作来调用 checkaccess 方法。此处。您将检查用户名的安全描述符和完成请求的适当权限,然后返回 true,表明访问权限已授予,或返回 false,表明访问权限被拒绝。
安全描述符
为报告服务器数据库中的项目配置授权策略时,客户端应用程式(例如 report manager)将把用户信息连同项目的安全策略提交给安全扩展。此安全策略和用户信息统称为安全描述符。安全描述符包含报告服务器数据库中的项目的以下信息:

对项目具备某种操作权限的组或用户。

项目的类型。

控制项目访问权的随机访问控制列表。

安全描述符是通过 web service 方法 setpolicies 和 setsystempolicies 创建的。有关这些方法和 web service 的周详信息,请参阅 reporting services 联机丛书。
授权流程
reporting services 授权由当前在配置为在服务器上运行的安全扩展控制。授权是基于角色的,并受限于 reporting services 安全体系结构提供的权限和操作。下图说明了如何授权用户对报告服务器数据库中的项目执行操作。


图 3如图 3 所示,授权按照以下顺序进行:

1.

身份验证完成后,客户端应用程式通过 reporting services web service 方法向报告服务器发出请求。身份验证票据以每个 web 请求的 http 标题中的 cookie 的形式传递给报告服务器。

2.

在进行任何访问权检查之前,cookie 将被验证。

3.

完成 cookie 的验证后,报告服务器将调用 getuserinfo,以便向用户授予标识。

4.

用户通过 reporting services web service 尝试操作。

5.

报告服务器调用 checkaccess 方法,

6.

并随即检索安全描述符,并将其传递给 checkaccess 的自定义安全扩展实现。此时,用户、组或电脑将和访问的项目的安全描述符进行比较,并被授予执行请求操作的权限。

7.

假如用户得到授权,web service 将执行操作,并向调用应用程式返回响应。
返回页首窗体身份验证示例
假如您尚未安装窗体身份验证示例,请下载 forms authentication sample installer,并在电脑上运行他,以安装示例代码。
关于该示例
窗体身份验证示例安全扩展可作为本指南的一部分下载,他使用窗体身份验证连同 sql server 提供和 reporting services 一起使用的自定义安全模式。本示例仅用于演示目的,而不适用于生产环境,也未在生产环境中进行测试。microsoft 对此示例不提供技术支持。在某些情况下,该示例中演示了最好做法(例如,创建单向哈希、带salt 的密码)。在其他情况下,为简单起见,而回避了最好做法。应注意,该示例安全扩展的配置和管理经常需要您在报告服务器电脑上拥有管理员访问权。不管怎样,都不建议在连接环境中的生产服务器上使用该示例。

假如您对 reporting services 安全扩展有任何疑问,请和 microsoft 咨询服务 (mcs)、主要支持服务 (pss) 或其他 microsoft 支持服务代表联系。

需要

要使用本示例,必须安装了以下工具:

安装了 microsoft sql server 2000 reporting services 的报告服务器。

用于访问 report manager 的 microsoft internet explorer 6.0 或更高版本。

安装了 microsoft® visual studio® .net 2003 的研发电脑。
注意事项
实现自定义安全扩展或使用该示例时,请注意以下事项:

不能在混和模式安全系统(例如,同时使用 windows authentication 和窗体身份验证)下运行报告服务器。这也适用于任何 asp.net 应用程式。

务必保存因配置该示例而更改的任何配置文档的备份副本。

尽管能够在部署该示例后恢复到 windows authentication,但这可能有一定难度。有关周详信息,请参阅本指南后面的“删除示例扩展”。

覆盖 windows authentication 是很危险的。报告服务器在安全面具备可扩展性,但仅使用了 windows authentication 对他进行了全面测试和支持。

请始终将安全套接字层 (ssl) 用于窗体身份验证。

在本示例中,用户输入传递到 transact-sql 命令,以进行身份验证。在您自己的自定义安全扩展(将窗体身份验证和 sql server 配合使用)中,应谨慎对待用户输入验证,并确保结果命令不包含语法错误。应确保验证任何用户输入,以防恶意用户导致应用程式运行任意的 sql 命令(也称为“sql 插入攻击”)。登录进程中验证提供的用户名尤为重要,因为报告服务器自定义安全模式完全取决于能否对用户进行正确的标识、身份验证和授权。

在自定义用户存储中,避免用户输入带有以下字符的名称:: ? ; @ & = + $ , / * > < | . " /。带有这些字符的用户名可能会导致“my reports”(我的报告)功能出现问题,因为文档夹在服务器中是使用用户名创建的,且这些字符可能导致文档夹名称和文档夹路径出现问题。示例代码使用正则表达式测试用户名是否有效,并确保路径名不超过允许的最大路径长度。应该在自定义身份验证代码中执行类似的验证。
窗体身份验证
窗体身份验证是一种 asp.net 身份验证,通过这种身份验证,可将未经身份验证的用户定向到 html 窗体。当用户提供凭据后,系统将发出包含身份验证票据的 cookie。在随后的请求中,系统首先检查该 cookie,确定报告服务器是否已对用户进行身份验证。

reporting services 本身不支持窗体身份验证。但是,可使用 reporting services api 提供的安全扩展接口对 reporting services 进行扩展,使其支持窗体身份验证。假如将 reporting services 扩展为能够使用窗体,请将安全套接字层 (ssl) 用于任何和报告服务器进行的通信,以防恶意用户获取对其他用户的 cookie 的访问权。ssl 可使客户端和报告服务器相互进行身份验证,并确保其他电脑无法读取这两台电脑之间的通信内容。通过 ssl 连接从客户端发出的任何数据都经过加密,这样,恶意的用户便无法截获发送至报告服务器的密码或数据。

实现窗体身份验证通常是为了支持非 windows 帐户和身份验证。图像界面将展示给请求访问报告服务器的用户,提供的凭据将提交给安全机构,以进行身份验证。

当有交互式用户输入凭据时,窗体身份验证方案就会派上用场。但是,对于和 reporting services web service 直接通信的无人值守应用程式,必须将窗体身份验证和自定义身份验证方案组合使用。

以下情况下,窗体身份验证适用于 reporting services:

需要对没有 microsoft windows 帐户的用户进行存储和身份验证,并

需要在 web 站点的不同页面间提供您自己的用户界面窗体作为登录页面。

编写支持窗体身份验证的自定义安全扩展时,请考虑以下事项:

假如使用窗体身份验证,则必须在 internet 信息服务 (iis) 中的报告服务器虚拟目录上启用匿名访问。

必须将 asp.net 身份验证配置为“forms”(窗体)。能够在报告服务器的 web.config 文档中配置 asp.net 身份验证。

reporting services 可使用 windows authentication 或自定义身份验证对用户进行身份验证和授权。reporting services 不支持同时使用多个安全扩展。
部署示例
要运行和检查窗体身份验证示例的代码,必须先执行几个步骤。执行安装和配置步骤后,即可在报告服务器上使用或调试示例,或在 visual studio .net 中查看示例代码。
编译和安装扩展程式集
必须按照以下步骤编译和安装扩展。这些步骤假设您已将 reporting services 安装到默认位置:c:/program files/microsoft sql server/mssql/reporting services。该位置在本指南的余下部分统称为 <install>。
使用 visual studio .net 编译示例
1.

在 microsoft visual studio .net 2003 中打开 customsecurity.sln。假如已下载了源代码并将示例安装到默认位置,便能够在 c:/program files/microsoft sql server/mssql/reporting services amples/extensions 中访问到他。

2.

在“解决方案资源管理器”中,选择 customsecurity 项目。

3.

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

4.

“添加引用”对话框将打开。

5.

单击“.net”选项卡。

6.

单击“浏览”进行导航,以在本地驱动器上找到 microsoft.reportingservices.interfaces。默认情况下,该程式集位于 <install>/reportserver/bin 目录中。单击“确定”。

选定的引用被添加至项目中。

7.

在“生成”菜单中单击“生成解决方案”。

8.

将 microsoft.samples.reportingservices.customsecurity.dll 和 microsoft.samples.reportingservices.customsecurity.pdb 复制到 <install>/reportserver/bin 目录中。

9.

将 microsoft.samples.reportingservices.customsecurity.dll 和 microsoft.samples.reportingservices.customsecurity.pdb 复制到 <install>/reportmanager/bin 目录中。

10.

将 logon.aspx 页复制到 <install>/reportserver 目录中,并将 uilogon.aspx 页复制到 <install>/reportmanager/pages 目录中。
将该扩展添加到配置文档中。
将程式集和登录页体身份验证适用于 report,需要对 report server 和 report manager 配置文档做一些修改。

要点:在进行任何更改前,请备份任何配置文档。
修改 rsreportserver.config 文档
1.

使用 visual studio .net 或一个简单的文本编辑器(例如,记事本)打开 rsreportserver.config 文档。rsreportserver.config 位于 <install>/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>
修改 rswebapplication.config 文档
1.

然后,需要打开位于 <install>/reportmanager 目录中的 report manager 配置文档 rswebapplication.config。

2.

找到 <ui> 元素,并按如下方式更新他:

<ui> <customauthenticationui> <loginurl>/pages/uilogon.aspx</loginurl> <usessl>true</usessl> </customauthenticationui> <reportserverurl>http://<server>/reportserver</reportserverurl></ui>

安全:假如在未安装 ssl 证书的研发环境中运行示例扩展,则必须在上一个配置项中将 <usessl> 元素的值更改为 false。将 reporting services 和窗体身份验证组合使用时,microsoft 建议您始终使用 ssl。
添加扩展的安全策略
您将需要为自定义安全扩展添加代码组,以便向扩展授予 fulltrust 权限。为此,能够将代码组添加到 <install>/reportserver 目录中的 rssrvpolicy.config 文档中。在安全策略文档中找到具备 $codegen 的 url 成员身份的现有代码组(如下所示),然后按如下方式将项目添加到 rssrvpolicy.config 中。

<codegroup class="unioncodegroup" version="1" permissionsetname="fulltrust"> <imembershipcondition class="urlmembershipcondition" version="1" url="$codegen$/*" /></codegroup><codegroup class="unioncodegroup" version="1" name="securityextensioncodegroup" description="示例安全扩展的代码组" permissionsetname="fulltrust"> <imembershipcondition class="urlmembershipcondition" version="1" url="c:/program files/microsoft sql server/mssql/reporting services/reportserver/bin/microsoft.samples.reportingservices.customsecurity.dll" /></codegroup>

注意:为简单起见,窗体身份验证示例命名不是很严格,在安全策略文档中需要的 url 成员身份项也很简单。在生产安全扩展实现中,应该创建强名称程式集,并在添加程式集的安全策略时使用强名称成员身份条件。有关强名称程式集的周详信息,请参阅 msdn 上的“creating and using strong-named assemblies”,其网址为 http://msdn.microsoft.com/library/en-us/cpguide/html/cpconworkingwithstrongly-namedassemblies.asp(英文)。

然后,需要在 <install>/reportmanager 目录中的 report manager 策略文档中为 mycomputer 代码组增加权限。在 rsmgrpolicy.config 中找到以下代码组,并按如下方式将 permissionsetname 属性从 execution 更改为 fulltrust:

<codegroup class="firstmatchcodegroup" version="1" permissionsetname="fulltrust" description="该代码组为 mycomputer 代码授予 execution 权限。 "> <imembershipcondition class="zonemembershipcondition" version="1" zone="mycomputer" />
配置 web.config 文档
要使用窗体身份验证,您需要修改 report manager 和 report server 的 web.config 文档,以更改身份验证并禁用模拟。

修改 report server 的 web.config 文档

1.

在文本编辑器中打开 web.config 文档。默认情况下,该文档位于 <install>/reportserver 目录中。

2.

找到 <identity> 元素,并将 impersonate 属性配置为 false。

<identity impersonate="false" />

3.

找到 <authentication> 元素,并将 mode 属性更改为 forms。

4.

将以下 <forms> 元素作为 <authentication> 元素的子级添加,并按如下方式配置 loginurl、name、timeout 和 path 属性:

<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 页上。

修改 report manager 的 web.config 文档

1.

打开 report manager 的 web.config。他位于 <install>/reportmanager 目录中。

2.

找到 <identity impersonate= "true" /> 部分,然后按如下方式更改他,以便禁用模拟:<identity impersonate="false" />。
配置匿名身份验证
默认情况下,windows 用户组 guests 包含 iusr_computername 帐户。该帐户用于最初的本地登录连同查看 logon.aspx 页。要支持窗体身份验证,必须启用 reportserver 虚拟目录的匿名访问。默认情况下,匿名访问被禁用。
启用匿名身份验证
1.

在“internet 信息服务”中,选择 reportserver 虚拟目录(通常是默认网站的成员),然后打开他的属性选项卡。

2.

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

3.

在“匿名访问和身份验证控制”部分,单击“编辑”。

将显示“身份验证方法”对话框。

4.

选中“匿名访问”复选框。

5.

单击“确定”。

6.

对 reports 虚拟目录重复上述步骤。
创建用户帐户数据库
示例包含一个数据库脚本,即 createuserstore.sql,用于在 sql server 数据库中为窗体示例建立一个用户存储。
创建 useraccounts 数据库
1.

打开“查询分析器”,然后连接到 sql server 的本地实例。

2.

找到 sql 脚本文档 createuserstore.sql。该脚本文档包含在示例项目文档中。注意,在脚本的结尾处,必须用您自己的电脑名替换“localmachine”。对于 windows 2003 用户,用 nt authority/network service 替换 localmachine/aspnet(在 iis 5 兼容模式下时除外)

3.

运行查询以创建 useraccounts 数据库。

4.

退出“查询分析器”。
测试示例
通过以下步骤测试示例扩展。注册管理员用户,即将该用户名、密码哈西和 salt 值添加到 useraccounts 数据库中的用户表。他还将需要您在报告服务器配置文档中输入该用户名。然后,您将以同一个用户身份登录以确保报告服务器正确运行密码验证例程连同正确加载扩展程式集。
测试示例安全扩展部署
1.

在命令提示符下运行 iisreset.exe,重新启动 iis。

2.

打开 report manager。您能够从 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 页,重新输入用户名和密码,然后单击“登录”。

您应该能够不受限制地访问 report manager 和报告服务器。创建的管理员用户对报告服务器的权限和对本地电脑上的内置管理员帐户的权限相同。在本示例中,只能将一位用户指定为管理员。拥有内置管理员帐户后,即可注册其他用户,并指派他们在报告服务器中的角色。

注意:建议将管理员用户添加到报告服务器的正式 system administrator 和 content manager(根文档夹)角色中。这可防止报告服务器数据库中出现空的安全描述符。有关 system administrator 和 content manager 角色的周详信息,请参阅 reporting services 联机丛书。
将 web service 用于自定义安全
您能够将 web service api 用于窗体身份验证,就像将 windows authentication 用于窗体身份验证相同。但是,您必须调用 web service 代码中的 logonuser,并传递当前用户的凭据。此外,web service 客户端将不具备 internet explorer 或其他 web 浏览器提供的自动 cookie 管理功能。您必须扩展 reportingservice 代理类以包含 cookie 管理。为此,能够覆盖 web service 类的 getwebrequest 和 getwebresponse 方法。

有关这方面的示例,请参阅 msdn 上的“reportingservice.logonuser method”,其网址为 http://msdn.microsoft.com/library/en-us/rsprog/htm/rsp_ref_soapapi_service_lz_3d7q.asp(英文)。
调试示例扩展
在调试程式中运行示例扩展不但可帮助您解决疑难问题,而且使您能够有效地浏览代码并查看运行中的报告服务器身份验证和授权进程。

microsoft .net framework 提供了多个可帮助您分析示例代码的调试工具。工具的使用效果取决于您试图完成的任务。在本指南中,所选的调试工具是 visual studio .net 2003。
调试窗体身份验证示例代码
1.

确保按照以下步骤部署示例。

2.

启动 visual studio .net 2003,并打开测试报告服务器上的 customsecurity.sln。

3.

打开 internet explorer,并导航至 report manager,同时使示例代码在 visual studio 中保持打开状态。

4.

导航至 visual studio 和自定义安全扩展项目,并在代码中配置一些断点。

5.

当扩展项目仍为活动窗口时,单击“调试”菜单上的“进程”。

“进程”对话框将打开。

6.

从进程列表中,选择 aspnet_wp.exe 进程(假如您的应用程式部署在 iis 6.0 上,请选择 w3wp.exe),然后单击“附加”。当“附加到进程”对话框打开时,确保选择了程式类型“公共语言运行库”,然后单击“确定”。为提高调试性能,确保未选择程式类型“本机”。

7.

现在,请在登录窗体中输入用户凭据,然后单击“登录”。假如碰到对应于断点的代码,调试程式将在第一个断点处停止执行。

8.

使用 f11 键浏览代码。有关使用 visual studio 进行调试的周详信息,请参阅 visual studio .net 文档。

注意:以这种方式进行调试需要大量的资源和处理器时间。假如碰到问题,请关闭 visual studio,重置 iis,然后通过将 customsecurity 解决方案附加到 asp.net 工作进程并登录到 report manager 来重新开始。
删除示例扩展
尽管通常不建议这么做,但删除示例后,仍能够恢复到 windows authentication。要恢复到 windows 安全,请执行下列操作:

从备份副本还原下列文档:web.config、rsreportserver.config 和 rswebapplication.config。这将把报告服务器的身份验证和授权方法配置为默认的 windows 安全。这还将删除您在 report server 或 report manager 配置文档中为扩展输入的内容。

在 internet 信息服务器 (iis) 中禁用报告服务器虚拟目录的匿名访问。

删除配置信息后,安全扩展对于报告服务器将不可用。您不必删除在示例安全扩展下运行报告服务器时所创建的任何安全描述符。启用 windows authentication 时,报告服务器自动将 system administrator 角色分配给托管报告服务器的电脑上的 builtin/administrators 组。但是,您必须为 windows 用户重新手动应用任何基于角色的安全。

通常,在迁移到不同的安全扩展后,建议您不要恢复到 windows authentication。否则,当您试图访问报告服务器中的项目时,假如他们具备自定义安全描述符而不具备 windows authentication 安全描述符,则可能会碰到错误。
返回页首结论
microsoft sql server 2000 reporting services 是个可用于企业报告研发和部署的可扩展报告平台。reporting services 包含一个 windows authentication 模块,该模块使用 windows 帐户确保对报告服务器访问的安全,但在某些情况下,可能需要支持不同安全模块。为此,reporting services 中包含了一组支持创建自定义安全扩展的安全扩展 api。在所提供的示例中,您已了解了通过窗体身份验证实现自定义安全的方法。microsoft 正致力于通过在 reporting services 的当前版本和后续版本中提供安全扩展性,来满足企业中不断增长的安全需求。 作为研发者,您应该意识到实现自定义安全扩展的风险,并应该谨慎考虑报告服务器所用的安全系统是否得到正确实现和应用。
返回页首参考资料
有关周详信息,请参阅 msdn 上的以下资源:

how to:use forms authentication with sql server 2000(英文)

forms authentication provider(英文)

using role-based security(英文)

microsoft.reportingservices.interfaces namespace(英文)
版本任何
本文档中包含的信息代表 microsoft corporation 在发布时对所讨论问题的最新观点。由于 microsoft 必须适应不断变化的市场情况,因此,这些信息并非 microsoft 方面所作的承诺,microsoft 也不能确保出版日之后提供的任何信息都完全正确。

本白皮书仅供参考。microsoft 对本文档中的有关信息不作任何明示或暗示的担保。

用户有责任遵从任何适用的版权法。除了版权法所赋予的权利以外,未经 microsoft corporation 明确书面许可,不得擅自将本文档的任何部分进行复制、存储或输入可检索系统,或以任何形式或方式(电子、机械、影印、录制或其他方式)进行传播,或用作其他目的。

microsoft 对本文档中的主题持有专利权、专利申请权、商标权、版权或其他相关的知识产权。microsoft 只提供在任何书面许可协议中明确规定的权利,而不授予您本文档的上述专利权、商标权、版权或其他知识产权。

©2004 microsoft corporation 版权任何。保留任何权利。

microsoft、visual studio 和 windows 是 microsoft corporation 在美国和/或其他国家的注册商标。

此处提到的真实的公司和产品名称是其各自任何者的商标。

© 2004 microsoft corporation 版权任何。保留任何权利。使用规定。 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值