Reporting Services 中的身份验证

身份验证是确立用户对某一身份的权限的过程。 您可以使用多种方法来验证某一用户的身份。 最常见的方法是使用密码。 例如,实现窗体身份验证时,需要一个实现,该实现可查询用户获取凭据(通常是由请求登录名和密码的接口),然后根据数据存储(例如数据库表或配置文件)验证用户。 如果无法验证凭据,身份验证过程将失败,并且用户假定匿名标识。

Reporting Services 中的自定义身份验证

在 Reporting Services 中,Windows 操作系统通过集成安全性或通过用户凭据的显式接受和验证来处理用户的身份验证。 可以在 Reporting Services 中开发自定义身份验证,以支持更多身份验证方案。 可以通过安全扩展接口 IAuthenticationExtension2实现此支持。 所有扩展插件都继承自报表服务器部署和使用的任何扩展插件的 IExtension 基接口。 IExtensionIAuthenticationExtension2,是命名空间的成员 Microsoft.ReportingServices.Interfaces

在 Reporting Services 中对报表服务器进行身份验证的主要方式是 LogonUser 方法。 此 Reporting Services Web 服务成员可用于将用户凭据传递到某一报表服务器以进行验证。 基础安全扩展插件实现包含自定义身份验证代码的 IAuthenticationExtension2.LogonUser 。 在窗体身份验证示例 LogonUser 中,对提供的凭据和数据库中的自定义用户存储执行身份验证检查 。 LogonUser 的实现的示例如下 :

public bool LogonUser(string userName, string password, string authority)  
{  
   return AuthenticationUtilities.VerifyPassword(userName, password);  
}  
  

以下示例函数用于验证提供的凭据:

  
internal static bool VerifyPassword(string suppliedUserName,  
   string suppliedPassword)  
{   
   bool passwordMatch = false;  
   // Get the salt and pwd from the database based on the user name.  
   // See "How To: Use DPAPI (Machine Store) from ASP.NET," "How To:  
   // Use DPAPI (User Store) from Enterprise Services," and "How To:  
   // Create a DPAPI Library" for more information about how to use  
   // DPAPI to securely store connection strings.  
   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(); // Advance to the one and only row  
      // Return output parameters from returned data stream  
      string dbPasswordHash = reader.GetString(0);  
      string salt = reader.GetString(1);  
      reader.Close();  
      // Now take the salt and the password entered by the user  
      // and concatenate them together.  
      string passwordAndSalt = String.Concat(suppliedPassword, salt);  
      // Now hash them  
      string hashedPasswordAndSalt =  
         FormsAuthentication.HashPasswordForStoringInConfigFile(  
         passwordAndSalt,  
         "SHA1");  
      // Now verify them. Returns true if they are equal.  
      passwordMatch = hashedPasswordAndSalt.Equals(dbPasswordHash);  
   }  
   catch (Exception ex)  
   {  
       throw new Exception("Exception verifying password. " +  
          ex.Message);  
   }  
   finally  
   {  
       conn.Close();  
   }  
   return passwordMatch;  
}  

身份验证流

Reporting Services Web 服务提供自定义身份验证扩展插件,以便支持通过 Web 门户和报表服务器进行窗体身份验证。

Reporting Services Web 服务的 LogonUser 方法用于将凭据提交到报表服务器以供身份验证。 Web 服务使用 HTTP 标头将身份验证票证(称为“cookie”)从服务器传递到客户端,以获取经过验证的登录请求。

下图描述了在您使用配置为使用自定义身份验证扩展插件的报表服务器部署应用程序时,向该 Web 服务验证用户身份的方法。

Screenshot of the Reporting Services security authentication flow.

如图 2 中所示,该身份验证流程如下:

  1. 客户端应用程序调用 Web 服务 LogonUser 方法以便验证某一用户的身份。

  2. 该 Web 服务调用安全扩展插件的 LogonUser 方法,具体而言,即实现 IAuthenticationExtension2 的类 。

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

  4. 在成功进行身份验证后,该 Web 服务将创建一个 cookie 并为会话管理它。

  5. 该 Web 服务将该身份验证票证返回到调用应用程序的 HTTP 标头上。

在该 Web 服务成功通过安全扩展插件验证用户身份后,它将生成用于后续请求的 cookie。 Cookie 可能不会保留在自定义安全机构中,因为报表服务器不拥有安全机构。 该 cookie 从 LogonUser Web 服务方法返回并且用于后续的 Web 服务方法调用和 URL 访问中。

注意

为了避免 Cookie 在传输期间泄漏,应使用传输层安全性 (TLS)(旧称为“安全套接字层 (SSL)”)加密来安全地传输从 LogonUser 返回的身份验证 Cookie。

如果在安装自定义安全扩展插件时通过 URL 访问来访问报表服务器,Internet Information Services (IIS) 和 ASP.NET 将自动管理身份验证票证的传输。 如果要通过 SOAP API 访问报表服务器,则代理类的实现必须包含管理身份验证票证的额外支持。 有关使用 SOAP API 和管理身份验证票证的详细信息,请参阅“使用具有自定义安全性的 Web 服务”。

窗体身份验证

表单身份验证是一种 ASP.NET 身份验证,其中,未经身份验证的用户定向到某一 HTML 表单。 一旦用户提供凭据后,系统将发出包含身份验证票证的 cookie。 在以后的请求中,系统将首先检查 Cookie,以查看报表服务器是否对用户进行身份验证。

可使用 Reporting Services API 提供的安全扩展性接口来扩展 Reporting Services,以支持表单身份验证。 如果将 Reporting Services 扩展为使用表单身份验证,请将传输层安全性 (TLS)(旧称为“安全套接字层 (SSL)”)用于与报表服务器的全部通信,以防止恶意用户获取对其他用户的 Cookie 的访问权限。 借助 TLS,客户端和报表服务器可以相互验证,并确保其他任何计算机都不能读取两台计算机之间的通信内容。 通过 TLS 连接从客户端发送的所有数据都经过加密,以便恶意用户无法截获发送到报表服务器的密码或数据。

表单身份验证实现为支持 Windows 以外的平台的帐户和身份验证。 向请求对某一报表服务器的访问的用户提供一个图形界面,并且提供的凭据将提交到安全机构以便进行身份验证。

窗体身份验证要求某一人输入凭据。 对于直接与 Reporting Services Web service 服务通信的无人参与应用程序,窗体身份验证必须与自定义身份验证架构相结合。

在以下情况下,表单身份验证适用于 Reporting Services:

  • 你需要存储和对没有 Microsoft Windows 帐户的用户进行身份验证,

  • 需要在网站上的不同页面之间提供自己的用户界面表单作为登录页。

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

  • 如果您使用窗体身份验证,则必须在 Internet 信息服务 (IIS) 的报表服务器虚拟目录上启用匿名访问。

  • ASP.NET 身份验证必须设置为“表单”。 在报表服务器的 Web.config 文件中配置 ASP.NET 身份验证。

  • Reporting Services 在验证用户的身份并为其授权时,既可以使用 Windows 身份验证,也可以使用自定义身份验证,但不能同时使用二者。 Reporting Services 不支持同时使用多个安全扩展插件。