身份验证是建立用户对标识的权利的过程。 有许多技术可用于对用户进行身份验证。 最常见的方法是使用密码。 例如,实现窗体身份验证时,需要一个实现,该实现可查询用户获取凭据(通常是由请求登录名和密码的接口),然后根据数据存储(例如数据库表或配置文件)验证用户。 如果无法验证凭据,身份验证过程将失败,用户将假定匿名标识。
Reporting Services 中的自定义身份验证
在 Reporting Services 中,Windows作系统通过集成安全性或通过显式接收和验证用户凭据来处理用户的身份验证。 可以在 Reporting Services 中开发自定义身份验证,以支持其他身份验证方案。 这可以通过安全扩展接口 IAuthenticationExtension实现。 所有扩展都继承自 IExtension 报表服务器部署和使用的任何扩展的基接口。 IExtension以及 IAuthenticationExtension命名空间的成员 Microsoft.ReportingServices.Interfaces 。
在 Reporting Services LogonUser 中针对报表服务器进行身份验证的主要方法是方法。 Reporting Services Web 服务的此成员可用于将用户凭据传递给报表服务器进行验证。 基础安全扩展实现包含自定义身份验证代码的 IAuthenticationExtension.LogonUser 。 在 Forms 身份验证示例中, 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 服务提供自定义身份验证扩展插件,以启用报表管理器和报表服务器的窗体身份验证。
LogonUser Reporting Services Web 服务的方法用于将凭据提交到报表服务器进行身份验证。 Web 服务使用 HTTP 标头将身份验证票证(称为“cookie”)从服务器传递到客户端进行验证的登录请求。
下图描述了在使用配置为使用自定义身份验证扩展插件的报表服务器部署应用程序时,将用户进行身份验证到 Web 服务的方法。
如图 2 所示,身份验证过程如下所示:
客户端应用程序调用 Web 服务 LogonUser 方法对用户进行身份验证。
Web 服务调用 LogonUser 安全扩展的方法,特别是实现 IAuthenticationExtension 的类。
实现验证 LogonUser 用户存储或安全机构中的用户名和密码。
身份验证成功后,Web 服务会创建 Cookie 并管理会话。
Web 服务将身份验证票证返回到 HTTP 标头上的调用应用程序。
当 Web 服务通过安全扩展成功对用户进行身份验证时,它会生成用于后续请求的 Cookie。 Cookie 可能不会保留在自定义安全机构中,因为报表服务器不拥有安全机构。 Cookie 从 LogonUser Web 服务方法返回,在后续的 Web 服务方法调用和 URL 访问中使用。
注释
为了避免在传输过程中损害 Cookie,应使用安全套接字层(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 以使用窗体身份验证,请使用安全套接字层(SSL)进行与报表服务器的所有通信,以防止恶意用户访问其他用户的 Cookie。 SSL 使客户端和报表服务器能够相互进行身份验证,并确保其他计算机无法读取两台计算机之间的通信内容。 通过 SSL 连接从客户端发送的所有数据都经过加密,以便恶意用户无法截获发送到报表服务器的密码或数据。
表单身份验证通常实现,以支持 Windows 以外的平台的帐户和身份验证。 向请求访问报表服务器的用户呈现图形界面,提供的凭据将提交到安全机构进行身份验证。
表单身份验证要求存在人员输入凭据。 对于直接与 Reporting Services Web 服务通信的无人参与应用程序,窗体身份验证必须与自定义身份验证方案相结合。
当:
你需要存储和对没有Microsoft Windows 帐户的用户进行身份验证,
你需要提供自己的用户界面表单作为网站上的不同页面之间的登录页。
编写支持窗体身份验证的自定义安全扩展时,请考虑以下事项:
如果使用窗体身份验证,则必须在 Internet Information Services(IIS)中的报表服务器虚拟目录中启用匿名访问。
ASP.NET 身份验证必须设置为 Forms。 在报表服务器的 Web.config 文件中配置 ASP.NET 身份验证。
Reporting Services 可以使用 Windows 身份验证或自定义身份验证对用户进行身份验证和授权,但不能同时对用户进行身份验证和授权。 Reporting Services 不支持同时使用多个安全扩展插件。