我有一个ASP.NET应用程序,它上面有一个ReportViewer控件:
<rsweb:ReportViewer ID="rv" runat="server" ProcessingMode="Remote"
ShowParameterPrompts="False"AsyncRendering="true" >
<ServerReport ReportPath="<My Report>" ReportServerUrl="<Report Server URL>" />
</rsweb:ReportViewer>
报表服务器在不同于我的应用服务器的服务器上运行,因此我在调用报表时传递凭据:
rv.ServerReport.ReportServerCredentials = New ReportCredentials()
rv.ServerReport.SetParameters(params)
rv.ServerReport.Refresh()
凭据在此类中:
<Serializable()> _
Public Class ReportCredentials
Implements Microsoft.Reporting.WebForms.IReportServerCredentials
Public Function GetFormsCredentials(ByRef authCookie As System.Net.Cookie, ByRef userName As String, ByRef password As String, ByRef authority As String) As Boolean Implements Microsoft.Reporting.WebForms.IReportServerCredentials.GetFormsCredentials
authCookie = Nothing
userName = Nothing
password = Nothing
authority = Nothing
Return False
End Function
Public ReadOnly Property ImpersonationUser() As System.Security.Principal.WindowsIdentity Implements Microsoft.Reporting.WebForms.IReportServerCredentials.ImpersonationUser
Get
Return Nothing
End Get
End Property
Public ReadOnly Property NetworkCredentials() As System.Net.ICredentials Implements Microsoft.Reporting.WebForms.IReportServerCredentials.NetworkCredentials
Get
Return New NetworkCredential(AppSettings("ReportUser"), Helpers.GetReportPassword(), AppSettings("ReportDomain"))
End Get
End Property
结束班
在我的web.config文件中,我有impersonate =“true”。
我遇到的问题是大多数用户都会收到此错误:
Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
如果我在我的帐户下运行该应用程序,然后让他们尝试在他们的帐户下运行。我可以通过回收应用程序运行的应用程序池来重现它们的错误。如果我在应用服务器上让用户成为本地管理员(就像我),那么它会起作用,但显然我不想这样做。关于我做错了什么的想法,以及为什么在我运行它之后应用程序突然为它们工作了?
答案 0 :(得分:1)
发现问题是访问应用服务器上的machine.config文件。由于我在IIS中运行模拟和集成身份验证,因此该应用程序作为登录用户运行。显然,在获取NetworkCredentials时,会访问machine.config。由于用户无权访问machine.config,因此失败。我猜测machine.config是缓存的,这就是为什么它在我作为我自己(管理员)运行应用程序后工作的原因。我现在继续向我的用户提供对machine.config的读访问权,这解决了这个问题。不确定是否有更好的方法。