C# 如何获得针对Windows集成安全应用程序进行身份验证的HTML敏捷性?

C# 如何获得针对Windows集成安全应用程序进行身份验证的HTML敏捷性?,c#,asp.net-mvc,html-agility-pack,iis-8,C#,Asp.net Mvc,Html Agility Pack,Iis 8,我正在尝试使用HTML Agility pack来抓取我的应用程序的一个页面,并将其作为邮件正文嵌入。这在我的开发机器上发挥了神奇的作用,但当我在远程IIS服务器上发布它时,我得到了401.1错误页面作为邮件正文 该应用程序使用Windows集成安全性进行身份验证和授权,我已在应用程序池中设置了服务帐户。因此,我尝试手动设置凭据以使用与应用程序池相同的帐户,并将其添加到授权角色,但仍然遇到相同的问题 这是我用来获取页面的代码: var lAuthentification = new Networ

我正在尝试使用HTML Agility pack来抓取我的应用程序的一个页面,并将其作为邮件正文嵌入。这在我的开发机器上发挥了神奇的作用,但当我在远程IIS服务器上发布它时,我得到了401.1错误页面作为邮件正文

该应用程序使用Windows集成安全性进行身份验证和授权,我已在应用程序池中设置了服务帐户。因此,我尝试手动设置凭据以使用与应用程序池相同的帐户,并将其添加到授权角色,但仍然遇到相同的问题

这是我用来获取页面的代码:

var lAuthentification = new NetworkCredential("username", "password", "domain");
var lProxy = new WebProxy() { Credentials = lAuthentification };
var lWeb = new HtmlWeb();
lWeb.PreRequest = delegate (HttpWebRequest webRequest)
{
    webRequest.Timeout = 1200000;
    return true;
};
var lPage = lWeb.Load(pURL, "GET", lProxy, lAuthentification);
我尝试了这两种方法,并在之前的答案中链接了解决方案,在我的机器上运行良好:

var lProxy = new WebProxy() { UseDefaultCredentials = true };
var lWeb = new HtmlWeb();
lWeb.PreRequest = delegate (HttpWebRequest webRequest)
{
    webRequest.Timeout = 1200000;
    return true;
};
var lPage = lWeb.Load(pURL, "GET", lProxy, CredentialCache.DefaultNetworkCredentials);
在我的控制器顶部有authorize子句
[authorize(Roles=@“RoleNames”)]
,因为所有数据都是敏感的。 许多消息来源解释说,当在应用程序池上设置域帐户时,必须设置SPN,但显然是这样,我们现在使用的是IIS8(Windows Server 2012),所以我认为这不应该有关系


我喜欢整个想法,我不想用string builder构建邮件正文,如果我有一个已经包含所有信息的页面,就从数据库中查找数据,因此,也许有一种方法可以在不发出web请求的情况下获取已处理的razor页面?

SPN在您绑定访问不属于服务器active directory域的公共域名时仍然是必需的。如果您网站的域名是www.a.com,而您的域名是b.com。然后你应该为你的站点设置SPN。它将告诉您的服务器KDC是否应该验证该用户凭据的Kerberos票证。请检查IIS日志中显示的错误凭据,并尝试直接访问它。如果您无法直接通过windows身份验证,请尝试为您的帐户设置SPN。它不在其他域中,而是在AD中,格式为app.server.domain.tld。它在日志中没有给我任何名字,只是一个破折号,就像是一个匿名请求。你试过禁用环回检查吗?我不知道,我不知道,但它确实可以禁用,所以我查找了它,发现我可以在选定的主机名上禁用它,因为这样也可以。谢谢你引导我朝那个方向走!