SQL SERVER 2008中,Reporting Service不再依赖于IIS,这带来很多利处,不过这也意味着不能够直接通过
配置IIS的虚拟目录部署来实现匿名访问了。下面我们就看一下在SSRS 2008中怎么能够实现
报表的“匿名访问”,不过对于一个正式项目来说,建议不要并且从不允许匿名来访问报表。(文/
孤独侠客)
1. 实现IReportServerCredentials接口 对于使用Asp.Net的ReportViewer
控件,实现IReportServerCredentials接口来实现自定义身份
验证,然后通过设置成ReportView的属性ServerReport.ReportServerCredentials。此接口的定义:
- public interface IReportServerCredentials
- {
- WindowsIdentity ImpersonationUser { get; }
- ICredentials NetworkCredentials { get; }
- bool GetFormsCredentials(out Cookie authCookie, out string userName, out string password, out string authority);
- }
复制代码
此接口定义了三种身份验证的方式来访问Report Server,可以单独使用,也可以组合使用这三种方式。
ImpersonationUser:ReportView在每次WebRequest请求到ReportServer前模拟的一个WindowsIdentity,实际上会调用这个属性的WindowsIdentity.Impersonate方法来完成。如果此属性返回null的话,则默认使用当前
线程用户。
NetworkCredentials: 此属性的值将会经由WebRequest.Credentials属性直接传递给WebRequest,如果返回null的话,则默认是CredentialCache.DefaultCredentials,使用当前上下文的系统凭据,这也是通常我们使用的方式。
GetFormsCredentials:这是ReportServer特有的认证体系,如果返回true的话,输出参数将用来调用ReportServer上的LogonUser方法,这个方法是用来支持服务器上的
安全扩展
插件。
这个接口是如何被使用的呢,我们从report viewer说起。当ASPX page页面执行时,ReportView控件并不是一次性的请求ReportServer。这其间其实需要通过ReportViewer HTTP handler多次请求Report Server.就比如报表中显示一个图片,在客户端生成的html中有图片标签,对于其中的图片会请求ReportView控件,ReportView收到请求后会重新请求ReportServer索要这个图片,ReportServer这时还需要判断当前请求的用户是否和初始的用户一一致,如果一致才会返回图片。其它的例如ReportView提供的打印,导出也是同样的原理。
ReportView控件的IReportServerCredentials的实例的属性,
存储在Asp.net SessionState中,这样即保证了安全性,又能够即时的获取到认证信息。不过这个接口提供的灵活性使我们在设置这个凭据时更加灵活,我们可以如下实现:
- [Serializable]
- class MyConfigFileCredentials : IReportServerCredentials
- {
- public MyConfigFileCredentials()
- {
- }
- public WindowsIdentity ImpersonationUser
- {
- get { return null; }
- }
- public ICredentials NetworkCredentials
- {
- get
- {
- return new NetworkCredential(
- ConfigurationManager.AppSettings["MyUserName"],
- ConfigurationManager.AppSettings["MyPassword"]);
- }
- }
- public bool GetFormsCredentials(out Cookie authCookie, out string userName, out string password, out string authority)
- {
- authCookie = null;
- userName = null;
- password = null;
- authority = null;
- }
- }
复制代码
上面我们只提供第二种认证方式,创建一个NetwrokCredential实例,并且采用配置文件中存储的用户名和密码,可以在后期修改。在配置文件中创建两个参数的值为能够正常访问此报表的账号和密码,然后给赋值给ReportView的属性即可:
- ReportViewer1.ServerReport.ReportServerCredentials = new MyConfigFileCredentials();
复制代码
这样,当你浏览报表程序时,就不会提示输入用户名和密码了。或许你看到这里应该也意识到了,我们所说的匿名访问报表,并不是说报表设置给了 everyone都可以访问,而是说我们包装了一下,省略了用户认证这一步,而模拟成了一个可以访问的用户,来实现的“匿名访问”。其实在先前使用IIS 作为报表服务器的时候,也是通过在IIS中设置虚拟目录或者网站,来实现了这个模拟的动作。