我们目前有 SSRS 报告使用需要使用调用用户凭据的 WCF 服务数据。在服务端,我们使用基本绑定来托管服务:
<binding name="TheBasicHttpBinding" maxReceivedMessageSize="50000000" transferMode="Streamed">
<readerQuotas maxArrayLength="50000000"/>
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows"/>
</security>
</binding>
<service behaviorConfiguration="DefaultServiceBehavior" name="Web.TheService">
<endpoint binding="basicHttpBinding" bindingConfiguration="TheBasicHttpBinding" name="ServiceHttpBinding"
contract="Web.ITheService"/>
</service>
在报表开发过程中,我们设置了一个供所有报表使用的共享数据源。数据源属于“XML”类型,指向服务端 .svc 文件。在我们的每个数据集中,我们提出如下请求:
<Query>
<Method Name="GetReferenceData" Namespace="http://localhost/2009/TheService">
<Parameters>
<Parameter Name="type"></Parameter>
</Parameters>
</Method>
<SoapAction>http://localhost/2009/TheService/ITheService/GetReferenceData</SoapAction>
</Query>
当使用下面的配置和调用调用我们远程托管的 WCF 服务时,我们的报告在 VS2008 中的开发机器上工作。
此外,当我们登录到 SSRS 报告服务器并直接在 IE 中的 SSRS 报告服务器上运行它们时,我们的报告就可以工作。
但是,如果我们远程访问 SSRS 报告链接(而不是坐在 SSRS 服务机器上),我们会收到如下错误:
报告处理过程中发生错误。(rsProcessingAborted) 共享数据集“客户端”的执行失败。(rsDataSetExecutionError) 数据集“”的查询执行失败。(rsErrorExecutingCommand) 无法执行指定 URL 的 Web 请求。未授权:远程服务器返回错误:(401)未授权。(rsXmlDataProviderError) 远程服务器返回错误:(401) 未经授权。401 - 未经授权:由于凭据无效,访问被拒绝。
服务器错误
401 - 未经授权:由于凭据无效,访问被拒绝。
您无权使用您提供的凭据查看此目录或页面。
--- 内部异常堆栈跟踪结束 --- 在 Microsoft.ReportingServices.DataExtensions.XmlDP 的 Microsoft.ReportingServices.DataExtensions.XmlDP.InMemoryCommand.Execute() 的 Microsoft.ReportingServices.DataExtensions.XmlDP.InMemoryCommand.ExecuteWebRequest(ICredentials credentials) .InMemoryCommand.<>c__DisplayClass1.b__0() 在 Microsoft.ReportingServices 的 Microsoft.ReportingServices.DataExtensions.XmlDP.InMemoryCommand.ExecuteReader(CommandBehavior 行为) 在 Microsoft.ReportingServices.DataExtensions.XmlDP.WebRequestHelper.ExecuteServerCallAsNtUser(ServerCall serverCall, WindowsIdentity ntUser)。 OnDemandProcessing.RuntimeDataSet.RunEmbeddedQuery(Boolean& readerExtensionsSupported, Boolean& readerFieldProperties, List
1 queryParams, Object[] paramValues) --- End of inner exception stack trace --- at Microsoft.ReportingServices.OnDemandProcessing.RuntimeDataSet.RunEmbeddedQuery(Boolean& readerExtensionsSupported, Boolean& readerFieldProperties, List
1 queryParams, Object[] paramValues) 在 Microsoft.ReportingServices.OnDemandProcessing.RuntimeDataSet.RunDataSetQueryAndProcessAsIRowConsumer(Boolean processAsIRowConsumer) 在 Microsoft.ReportingServices.OnDemandProcessing.RuntimeDataSet.Process() 在 Microsoft.ReportingServices.OnDemandProcessing.RuntimeDataSet.ProcessConcurrent(Object threadSet) -- - 内部异常堆栈跟踪结束 --- 在 Microsoft.ReportingServices.Library.SharedDataExecutionInstance.CreateDataChunk(IChunkFactory targetChunkFactory, String dataChunkName) 在 Microsoft.ReportingServices.Library 的 Microsoft.ReportingServices.ReportProcessing.ReportProcessing.ProcessSharedDataSet(DataSetContext dc, DataSetDefinition dataSetDefinition) .SharedDataExecutionInstance.Execute(DataSetInfo 数据集,字符串 targetChunkNameInReportSnapshot,ParameterInfoCollection dataSetParameterValues, ReportProcessingContext originalProcessingContext, Boolean originalRequestNeedsDataChunk, IRowConsumer originalRequest) 在 Microsoft.ReportingServices.Library.SharedDataSetExecution.Process(DataSetInfo sharedDataSet, String targetChunkNameInReportSnapshot, Boolean originalRequestNeedsDataChunk, IRowConsumer originalRequest, ParameterInfoCollection dataSetParameterValues, ReportProcessingContext originalOnDemandDataService) 在 Microsoft.RuntimeSet. GetSharedDataSetChunkAndProcess(Boolean processAsIRowConsumer, DataSetInfo dataSetInfo, ParameterInfoCollection datasetParameterCollection) 在 Microsoft.ReportingServices.OnDemandProcessing.RuntimeDataSet.RunDataSetQueryAndProcessAsIRowConsumer(Boolean processAsIRowConsumer) 在 Microsoft。ReportingServices.OnDemandProcessing.RuntimeDataSet.Process() at Microsoft.ReportingServices.OnDemandProcessing.RuntimeDataSet.ProcessConcurrent(Object threadSet) --- 内部异常堆栈跟踪结束 ---;
关于为什么我们的报告在调用我们的远程 WCF 服务的 VS2008 中工作的任何想法,并且当使用 IE 直接在 SSRS 服务器上运行时报告也可以正常工作,但是当调用托管在 SSRS 机器上的这些相同的报告 URL 时,我们会收到此报告处理错误?
为了能够从 SSRS 服务器访问 WCF 服务 WSDL,我们必须将 WCF 服务的机器 url 添加到本地 Intranet 区域列表中,这样我们就不会受到凭据的挑战。当我们删除这些条目时,即使在 SSRS 机器上直接运行它们时,我们也不会成功。我们假设问题在于将用户凭据传递给 SSRS 以及建立后续数据源 url 连接的方式。
我们的数据源使用“Windows 集成安全”,我们在 VS 中成功运行的帐户与我们直接在 SSRS 报表服务器上成功运行 IE 的帐户相同。这也是我们在尝试从远程计算机上的 IE 访问 SSRS 报告时遇到上述异常的同一帐户。
有人遇到过这样的事情或有任何想法吗?我们查看了 SSRS 日志,但还没有发现它们有用。请注意,我们需要在实际的最终用户凭据下运行报告,因为这些凭据需要传递到 WCF 服务,在该服务中,我们根据权限显示/过滤数据。
将“凭据安全地存储在报表服务器中”设置为 true 并存储我自己的帐户(我用于其他成功的测试)时,远程链接适用于所有人。但是,这会产生一个问题,因为所有 WCF/XML 请求都在我的凭据的上下文中使用。我们需要在调用用户的上下文中使用“Windows 集成安全性”发出所有请求。这引入的另一个问题是,为什么如果我将我的凭据存储在报告中,它是否适用于所有远程用户和我自己,但是当将数据源设置为“Windows 集成安全性”时,它甚至对我不起作用 - 相同的凭据。
更新:
看来这个“双跳”问题可能就是我们正在经历的:Reporting Services XML Datasource 上的集成安全性。
我发现的一些文章看起来有同样的问题: