如图所示,身份验证和授权按如下过程进行:c hina it power . c om5EOop2s
1.c hina it power . c om5EOop2s |
用户尝试通过输入 URL 来访问 Report Manager,然后被重定向到一个为客户端应用程序收集用户凭据的窗体。 c hina it power . c om5EOop2s |
2.c hina it power . c om5EOop2s |
该用户将凭据提交给窗体。 c hina it power . c om5EOop2s |
3.c hina it power . c om5EOop2s |
通过 LogonUser 方法将该用户的凭据提交给 Reporting Services Web service。 c hina it power . c om5EOop2s |
4.c hina it power . c om5EOop2s |
Web service 调用客户提供的安全扩展,并验证自定义安全机构中是否存在该用户名和密码。 c hina it power . c om5EOop2s |
5.c hina it power . c om5EOop2s |
进行身份验证时,Web service 将创建身份验证票据(称作“Cookie”),管理该票据,并验证该用户的角色能否访问 Report Manager 的主页。 c hina it power . c om5EOop2s |
6.c hina it power . c om5EOop2s |
Web service 将 Cookie 返回给浏览器,并在 Report Manager 中显示相应的用户界面。 c hina it power . c om5EOop2s |
7.c hina it power . c om5EOop2s |
身份验证结束后,浏览器向 Report Manager 发出请求,同时在 HTTP 标头中传输此 Cookie。这些请求是为响应 Report Manager 应用程序中的用户操作而发出的。 c hina it power . c om5EOop2s |
8.c hina it power . c om5EOop2s |
该 Cookie 连同请求的用户操作在 HTTP 标头中一起被传输到 Web service。 c hina it power . c om5EOop2s |
9.c hina it power . c om5EOop2s |
Cookie 将接受验证,如果它有效,报告服务器将从报告服务器数据库中返回与请求操作相关的安全描述符和其他信息。 c hina it power . c om5EOop2s |
10.c hina it power . c om5EOop2s |
如果 Cookie 有效,报告服务器将调用安全扩展,以检查该用户是否有权执行特定的操作。 c hina it power . c om5EOop2s |
11.c hina it power . c om5EOop2s |
如果该用户已被授权,报告服务器将执行请求的操作,并将控制返回给调用方。 c hina it power . c om5EOop2s |
12.c hina it power . c om5EOop2s |
该用户经过身份验证后,对报告服务器的 URL 访问将使用相同的 Cookie。该 Cookie 在 HTTP 标头中传输。 c hina it power . c om5EOop2s |
13.c hina it power . c om5EOop2s |
用户继续在报告服务器上请求操作,直至会话结束。 c hina it power . c om5EOop2s |
安全扩展 API
下表列出了安全扩展的可用接口和类。c hina it power . c om5EOop2s
接口或类 | 说明 |
IAuthenticationExtension 接口c hina it power . c om5EOop2s | 表示 Reporting Services 中的身份验证扩展,使您能够实现可用于用户身份验证(使用自定义身份验证方案)的安全扩展类。c hina it power . c om5EOop2s |
IAuthorizationExtension 接口c hina it power . c om5EOop2s | 表示可用于扩展 Reporting Services 的授权功能的扩展,使您能够实现可用于授权用户执行操作的安全扩展类。c hina it power . c om5EOop2s |
IExtension 接口c hina it power . c om5EOop2s | 表示 Reporting Services 中的扩展。c hina it power . c om5EOop2s |
AceCollection 类c hina it power . c om5EOop2s | 表示指定一个或多个受信任者的访问权限的访问控制项的集合。c hina it power . c om5EOop2s |
AceStruct 类c hina it power . c om5EOop2s | 受信任者(用户、组或计算机)的访问控制项,用于指定受信者可以对报告服务器数据库中的项目执行的操作。c hina it power . c om5EOop2s |
CatalogOperationsCollection 类c hina it power . c om5EOop2s | 表示目录操作集合。c hina it power . c om5EOop2s |
DatasourceOperationsCollection 类c hina it power . c om5EOop2s | 表示数据源操作集合。c hina it power . c om5EOop2s |
FolderOperationsCollection 类c hina it power . c om5EOop2s | 表示文件夹操作集合。c hina it power . c om5EOop2s |
OperationNames 类c hina it power . c om5EOop2s | 包含用户可以对 Reporting Services 中的项目执行的操作的字段名和相应值。c hina it power . c om5EOop2s |
ReportOperationsCollection 类c hina it power . c om5EOop2s | 表示报告操作集合。c hina it power . c om5EOop2s |
ResourceOperationsCollection 类c hina it power . c om5EOop2s | 表示资源操作集合。c hina it power . c om5EOop2s |
有关安全扩展 API 的各种接口和类的详细信息,请参阅 Reporting Services 联机丛书。c hina it power . c om5EOop2s
Reporting Services 中的身份验证
身份验证是建立用户身份权限的过程。有许多方法可用于用户身份验证。最常用的方法是使用密码。实现窗体身份验证时,应使用这样的实现:请求用户提供凭据(一般通过要求输入登录名和密码的某种界面),然后根据用户存储(例如,数据库表或配置文件)验证用户。如果凭据无法得到验证,身份验证进程将失败,用户将获取匿名身份。c hina it power . c om5EOop2s
在 Reporting Services 中,Windows 操作系统通过集成的安全性或通过用户凭据的显式接收和验证来处理用户的身份验证。可对 Reporting Services 中的自定义身份验证进行开发,使之支持其他身份验证方案。为此,可使用安全扩展接口 IAuthenticationExtension。所有扩展都继承于 IExtension,它是报告服务器部署和使用的任何扩展的基本接口。IExtension 和 IAuthenticationExtension 是 Microsoft.ReportingServices.Interfaces 命名空间的成员。c hina it power . c om5EOop2s
LogonUser 方法是 Reporting Services 中所有身份验证的核心。可使用它将用户凭据传递给报告服务器进行验证。基础安全扩展实现包含自定义身份验证代码的 IAuthenticationExtension.LogonUser。在窗体身份验证示例(将在本指南后面部分介绍)中,LogonUser 根据提供的凭据和数据库中的自定义用户存储区执行身份验证检查。在窗体身份验证示例中,它类似于以下过程:c hina it power . c om5EOop2s
在 AuthenticationExtension.cs(窗体身份验证示例)中c hina it power . c om5EOop2s
public bool LogonUser(string userName, string password, string authority) { return AuthenticationUtilities.VerifyPassword(userName, password); }
在 AuthenticationUtilities.cs(窗体身份验证示例)中c hina it power . c om5EOop2s
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; }