C#调用Reporting Service 的服务

  使用传统的web引用方式访问 Reporting service 的方法,可以参考这位仁兄的博文:实现SQL2008 Reporting Service的表单验证: http://www.cnblogs.com/dege301/archive/2009/09/04/1560456.html 

  

  不过,报表服务器 Web 服务提供了几个端点,上面文章使用的是ReportService2005端点,查询了下MSDN:http://msdn.microsoft.com/zh-cn/library/ms155398.aspx,微软推荐使用的是ReportService2010(应该是从sql 2008 R2以上版本),原文如下:"有三个端点可用于管理报表服务器上的对象,即:ReportService2005ReportService2006ReportService2010ReportService2005   端点用于管理配置为本机模式的报表服务器上的对象.ReportService2006   端点用于管理配置为 SharePoint 集成模式的报表服务器上的对象。ReportService2010 端点合并了 ReportService2005ReportService2006 的功能,可以管理为本机或 SharePoint 集成模式配置的报表服务器上的对象"

  另外,由于年代不同了,我们进入了WCF时代,所以我一般更习惯使用 web服务的方式来调用,如果您正在搜索关于调用Reporting Service 的服务的这个错误:

"HTTP 请求未经客户端身份验证方案“****”授权。从服务器收到的身份验证标头为“NTLM”" ,那你来对地方了;

  本人环境 :sql Reporting Service 2012(非本机) +vs2010, 没有测试sql 2008 环境应该是一样的;

  添加web服务我就不详细说了,弄完以后,需要修改相应的wcf配置文件(webconfig 或者 app.config里面),内容如下:

      <basicHttpBinding>
      ...........略去............................
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Ntlm" proxyCredentialType="None"
              realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>

  请注意修改红色字体的地方,另外,在调用服务的时候,记得调整模拟认证的级别:

  //服务

  RS2012.ReportingService2010SoapClient rs2010 = new RS2012.ReportingService2010SoapClient();

  //记得调整模拟级别

   rs2010.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

  //账户信息

  rs2010.ClientCredentials.Windows.ClientCredential = new NetworkCredential("用户", "密码", "本机名/域名");

  //然后可以开始调用接口方法了

    RS2012.ListChildrenRequest rq = new RS2012.ListChildrenRequest();
            rq.ItemPath = "/";
            rq.Recursive = true;
            RS2012.ListChildrenResponse rs1 = rs2010.ListChildren(rq);

    ....

     总结分析:这个涉及到wcf的传输安全的相关知识,具体可以参考蒋金楠老师的相关博文或者他的书《wcf全面解析》(我查的这个书),或者MSDN ,学习不深不敢多说,由于BasicHttpBinding的默认模式为None,而ssrs必须使用TransportCredentialOnly传输模式(BasicHttpBinding独有的模式),而定义在枚举类型HttpClientCredentialType有六种不同的客户端用户凭证类型体现了服务端针对客户端不同的认证方式:

  • None:客户端无需指定用户凭证,即匿名认证。此为默认值;
  • Basic:采用Basic认证方式进行客户端认证。在这种认证方式下,客户端需要提供有效的用户名和密码,但是仅仅采用较弱的方式对密码进行加密。所以当且仅当你确定客户端和服务端之间的连接绝对安全的前提下,你才能用这种认证方式;
  • Digest:采用Digest认证方式进行客户端认证。Digest认证提供与Basic一样的认证功能,但是在安全性上有所提升。主要体现并不是直接将用户名和密码直接进行网络传输,而是对其进行哈希计算(MD5)得到一个哈希码(此过程又称为Message Digest),最终传输的是该哈希码;
  • Ntlm:表示使用基于NTLM方式的Windows集成认证方式对客户端进行认证;
  • Windows:表示使用Windows集成认证的方式对客户端进行认证。如果能够使用Kerberos,则直接采用Kerberos进行认证,否则才使用NTLM;
  • Certificate:表示客户端的身份通过一个X.509数字证书表示,服务端通过校验证书的方式来确定客户端的真实身份。(http://www.cnblogs.com/artech/archive/2011/05/25/authentication_031.html)

  这里 我们必须使用Ntlm模式;

  在采用Windows认证的情况下,服务可以在成功认证后可以获取代表客户端身份的WindowsIdentity对象。但是服务端是否可以根据WindowsIdentity获取客户端身份信息,是否可以模拟客户端身份访问某些安全资源,这取决于该WindowsIdentity的模拟级别,而

 成员名称说明
受 适用于 Windows 应用商店应用的 .NET 支持None    未指定模拟级别。           
受 适用于 Windows 应用商店应用的 .NET 支持    Anonymous    服务器进程无法获取有关客户端的标识信息,且无法模拟客户端。           
受 适用于 Windows 应用商店应用的 .NET 支持    Identification    服务器进程可以获取有关客户端的信息(如安全标识符和特权),但是无法模拟客户端。  这对于导出自己的对象的服务器(如导出表和视图的数据库产品)十分有用。  在不能使用其他正使用客户端安全上下文的服务的情况下,服务器可以使用检索到的客户端安全信息做出访问验证决策。      
受 适用于 Windows 应用商店应用的 .NET 支持    Impersonation    服务器进程可以在其本地系统上模拟客户端的安全上下文。  服务器无法在远程系统上模拟客户端。      
受 适用于 Windows 应用商店应用的 .NET 支持    Delegation    服务器进程可以在远程系统上模拟客户端的安全上下文。

 这里需要设置模拟级别为Impersonation ,才能访问;

 

 

转载于:https://www.cnblogs.com/lzw2013/archive/2013/04/10/3012902.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值