SSRS使用调用用户凭据问题来使用WCF服务

时间:2013-08-13 11:03:03

标签: reporting-services ssrs-2008

我们目前有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>

在报告开发期间,我们设置了所有报告使用的共享数据源。数据源的类型为&#34; XML&#34;并指向服务端点.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)   共享数据集&#39;客户端执行失败。 (rsDataSetExecutionError)   数据集的查询执行失败&#39;&#39;。 (rsErrorExecutingCommand)   无法执行指定URL的Web请求。未经授权:远程服务器返回错误:(401)未经授权。 (rsXmlDataProviderError)   远程服务器返回错误:(401)未经授权。 401 - 未授权:由于凭据无效,访问被拒绝。

服务器错误

401 - 未经授权:由于凭据无效,访问被拒绝。

您无权使用以下凭据查看此目录或页面你提供了。

     

---内部异常堆栈跟踪结束---      在Microsoft.ReportingServices.DataExtensions.XmlDP.InMemoryCommand.ExecuteWebRequest(ICredentials凭据)      在Microsoft.ReportingServices.DataExtensions.XmlDP.InMemoryCommand.Execute()      在Microsoft.ReportingServices.DataExtensions.XmlDP.InMemoryCommand。&lt;&gt; c__DisplayClass1.b__0()      在Microsoft.ReportingServices.DataExtensions.XmlDP.WebRequestHelper.ExecuteServerCallAsNtUser(ServerCall serverCall,WindowsIdentity ntUser)      在Microsoft.ReportingServices.DataExtensions.XmlDP.InMemoryCommand.ExecuteReader(CommandBehavior behavior)      在Microsoft.ReportingServices.OnDemandProcessing.RuntimeDataSet.RunEmbeddedQuery(Boolean&amp; readerExtensionsSupported,Boolean&amp; 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.ReportProcessing.ReportProcessing.ProcessSharedDataSet(DataSetContext dc,DataSetDefinition dataSetDefinition)      在Microsoft.ReportingServices.Library.SharedDataExecutionInstance.CreateDataChunk(IChunkFactory targetChunkFactory,String dataChunkName)      在Microsoft.ReportingServices.Library.SharedDataExecutionInstance.Execute(DataSetInfo dataSet,String targetChunkNameInReportSnapshot,ParameterInfoCollection dataSetParameterValues,ReportProcessingContext originalProcessingContext,Boolean originalRequestNeedsDataChunk,IRowConsumer originalRequest)      at Microsoft.ReportingServices.Library.SharedDataSetExecution.Process(DataSetInfo sharedDataSet,String targetChunkNameInReportSnapshot,Boolean originalRequestNeedsDataChunk,IRowConsumer originalRequest,ParameterInfoCollection dataSetParameterValues,ReportProcessingContext originalProcessingContext)      在Microsoft.ReportingServices.OnDemandProcessing.RuntimeDataSet.GetSharedDataSetChunkAndProcess(Boolean processAsIRowConsumer,DataSetInfo dataSetInfo,ParameterInfoCollection datasetParameterCollection)      在Microsoft.ReportingServices.OnDemandProcessing.RuntimeDataSet.RunDataSetQueryAndProcessAsIRowConsumer(Boolean processAsIRowConsumer)      在Microsoft.ReportingServices.OnDemandProcessing.RuntimeDataSet.Process()      在Microsoft.ReportingServices.OnDemandProcessing.RuntimeDataSet.ProcessConcurrent(Object threadSet)      ---内部异常堆栈跟踪结束---;

为什么我们的报告在VS2008中调用我们的远程WCF服务的任何想法,并且报告在直接在带有IE的SSRS服务器上运行时工作正常,但是当在SSRS上托管这些相同的报告URL时机器我们得到这个报告处理错误?

为了能够从SSRS服务器访问WCF服务WSDL,我们必须将我们的WCF服务的机器URL添加到本地Intranet区域列表,以便我们不会因为凭据而受到质疑。当我们删除这些条目时,即使在SSRS报告上直接在SSRS机器上运行它们,我们也不会取得成功。我们假设问题在于将用户凭据传递给SSRS并建立后续数据源URL连接的方式。

我们的数据源使用&#34; Windows集成安全性&#34;我们在VS中成功运行的帐户与我们在SSRS报表服务器上直接成功运行IE的帐户相同。此外,这是我们在尝试从远程计算机上的IE访问SSRS报告时获得上述异常的帐户。

之前有人遇到过这样的事情或有任何想法吗?我们查看了SSRS日志,但还没有发现它们有用。请注意,我们需要在实际最终用户凭据下运行报告,因为这些凭据需要传递到WCF服务,我们根据权限显示/过滤数据。

设置&#34;凭据安全地存储在报表服务器中&#34;如果存储我自己的帐户(我用于其他成功的测试),则远程链接适用于所有人。但是,这会产生问题,因为所有WCF / XML请求都在我的凭据上下文中使用。我们需要使用&#34; Windows集成安全性和#34;在主叫用户的上下文下。这个问题引入的另一个问题是,如果我将我的凭据存储在报告中,它是否适用于所有远程用户和我自己,但是在将数据源设置为&#34; Windows集成安全性时#34;它甚至不适合我 - 相同的凭据。

更新

这似乎是&#34;双跳&#34;问题可能是我们遇到的问题:Integrated Security on Reporting Services XML Datasource

我发现哪些文章看起来有同样的问题:

0 个答案:

没有答案