HttpWebRequest 401错误

时间:2013-12-04 04:20:32

标签: iis-7 httpwebrequest unauthorized applicationpoolidentity

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

       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正在使用Negotiate和NTLM。 (由于复杂的原因,无法更改Kerberos),在ApplicationPoolIdentity下运行

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

任何人都可以提供帮助吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

enter image description here

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