具有Kerberos身份验证的ASP.NET HttpWebRequest

具有Kerberos身份验证的ASP.NET HttpWebRequest,asp.net,httpwebrequest,kerberos,Asp.net,Httpwebrequest,Kerberos,我正在尝试连接到一个使用Kerberos身份验证来授权用户的web服务,但每次我尝试发出请求时,都会得到一个401未经授权的证书。下面是我正在使用的代码。提前感谢您提供的任何帮助 public XPathNavigator GSASearch(string url, string searchString) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + searchString

我正在尝试连接到一个使用Kerberos身份验证来授权用户的web服务,但每次我尝试发出请求时,都会得到一个401未经授权的证书。下面是我正在使用的代码。提前感谢您提供的任何帮助

    public XPathNavigator GSASearch(string url, string searchString)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + searchString);
        request.CookieContainer = new CookieContainer();
        request.Credentials = CredentialCache.DefaultCredentials;
        request.ContentType = "text/xml";
        request.Method = "POST";

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        Stream receiveStream = response.GetResponseStream();

        XPathDocument doc = new XPathDocument(receiveStream);
        return doc.CreateNavigator();
    }
编辑:我觉得我应该多解释一下我想做什么。我的任务是为我公司的谷歌搜索设备提供一个新的界面。我使用的是ASP.NET页面,它可以根据用户的位置选择一个集合等,然后向GSA发送相应的搜索字符串。在他们决定打开身份验证之前,这一切都很正常,现在我无法得到任何结果(我要么收到401未经授权的消息,要么收到一条消息说“根级别的数据无效”)。如果我获取搜索字符串并将其直接提供给GSA,它会很好地进行身份验证并显示结果,我似乎无法通过HttpWebRequest获得它

编辑2:我做了更多的检查(通过Fiddler运行了请求),看起来请求只是在尝试协商,而不是Kerberos。我将凭据设置为显式使用Kerberos,如下所示,但没有帮助

    public XPathNavigator GSASearch(string url, string searchString)
    {
        CredentialCache credCache = new CredentialCache();
        credCache.Add(new Uri(url), "Kerberos", CredentialCache.DefaultNetworkCredentials);

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + searchString);
        request.CookieContainer = new CookieContainer();
        request.PreAuthenticate = true;
        request.Credentials = credCache;
        request.ContentType = "text/xml";
        request.Method = "POST";

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        Stream receiveStream = response.GetResponseStream();

        //StreamReader readStream = new StreamReader(receiveStream);

        XPathDocument doc = new XPathDocument(receiveStream);
        return doc.CreateNavigator();
    }
编辑3:好的,再次仔细查看,CredentialCache.DefaultCredentials中似乎没有我的网络凭据…

1)您是否使用浏览器对GSA的成功会话进行了wireshark跟踪?这样行吗

2) 如果#1起作用,GSA在第一个未经验证的请求中发送的WWW Authenticate报头是什么

3) 运行ASPX应用程序的计算机是否属于GSA所在的同一AD域的一部分?AFAIK这可能是一个成功的身份验证所必需的

4) 接下来,由于是ASPX应用程序执行请求,因此您不能使用DefaultCredentials,因为您实际上需要GSA信任的用户的凭据。为此,您应该为与GSA对话的应用程序创建一个特殊的用户帐户,或者让每个用户都是GSA上的受信任用户,并让ASPX页面首先对用户进行身份验证,然后使用委派将这些凭据传递给GDA。为此,您还必须使运行ASPX应用程序的服务器受信任以进行委派


在我看来,您应该首先将代码建模到您运行并调试的控制台应用程序中。然后将其移植到ASPX页面。这样,您就可以知道故障是由于主机(ASPX vs console)还是其他原因造成的。

您没有提到在何处运行客户端。它是控制台应用程序、aspx应用程序等吗?抱歉…它是aspx应用程序我猜您没有正确安装Active Directory。。。两台服务器之间需要设置一些信任设置您是正确的…我最终确定需要信任服务器进行委派…一旦我得到了,我就可以开始了。好的,在尝试使用fiddler执行步骤1时发现了一个新问题…它需要连接到https://链接,而不是http://。我尝试将我的连接url更改为https://但这并没有真正起作用(事实上,https://url仍然适用于对GSA的未经验证的调用,所以我真的怀疑这是问题所在)。不确定这是否会影响您提供的其他步骤。使用fiddler,当我直接从GSA成功尝试时,在标题信息中看不到任何WWW身份验证。在#3上,是的,它们位于同一个域上。这就是我要做的。我会使用Firefox和Firebug插件。启动firefox,并激活firebug插件。接下来,浏览到GSA并查看验证序列。Firebug将向您显示HTTP请求/响应。检查以查看HTTP请求/响应头,并验证是否正在进行任何身份验证。