1

我正在开发一个 Intranet 应用程序(Windows 身份验证),它从报告服务器下载报告流,然后将其保存为文件。当我在调试模式下运行它时,它工作正常。代码如下:

       HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);

       req.UseDefaultCredentials = true; 

        HttpWebResponse response = (HttpWebResponse)req.GetResponse();
        Stream fStream = response.GetResponseStream();

但是,在我将它部署到服务器后,它不会得到响应,而是得到 401 未经授权的错误。

即使我将代码更改为: HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);

        string domain = ConfigurationManager.AppSettings["SchedulerDomain"];
        string userName = ConfigurationManager.AppSettings["SchedulerUser"];
        string passWord = ConfigurationManager.AppSettings["SchedulerPassword"];
        NetworkCredential credential = new System.Net.NetworkCredential(userName, passWord, domain);
        req.Credentials = credential;

         HttpWebResponse response = (HttpWebResponse)req.GetResponse();
        Stream fStream = response.GetResponseStream();

得到同样的错误。代码中的用户设置具有查看/运行报告的权限。

IIS7 正在使用协商和 NTLM。(由于复杂的原因,无法更改 Kerberos),在 ApplicationPoolIdentity 下运行

我的问题是,当我在调试模式下运行它时,用户是我的 windows 帐户,但是为什么当我尝试将凭据发送到报告服务器时它会失败?

任何人都可以帮忙吗?

4

2 回答 2

0

我捕获了从应用服务器到报告服务器的所有请求,发现所有请求的标头的凭据用户名和域、密码均为空。最后我认为是 NTLM 导致了这个问题,因为这里需要两个 NTLM 无法处理的凭证跃点,需要使用 Kerberos。

如果您不能使用 Kerberos 身份验证,还有另一种解决方案:禁用 asp.net 模拟,因此从应用服务器到报告服务器将使用 applicationpoolidentity,这是一个本地计算机帐户,帐户如下:domain/machinename$。因此,如果您授予此帐户在报告服务器上的浏览权限,它应该可以工作。

于 2013-12-06T04:19:10.293 回答
0

我不确定您的 IIS 是如何配置的,但您的应用程序的应用程序池设置中的标识似乎覆盖了任何提供的凭据。最明显的是,它尝试进行身份验证的用户没有访问权限。话虽如此,请转到您的 IIS 管理器并检查站点应用程序池的身份设置。

在此处输入图像描述

将其更改为有权访问报表查看器并且应该修复它的用户。我在这里发布了一个类似的问题,以防有人感兴趣。

于 2017-10-06T18:45:48.030 回答