2010-09-14 116 views
1

我试图连接到使用Kerberos身份验证来授权用户的Web服务,但我每次尝试发出请求时都会收到401未授权的问题。以下是我正在使用的代码。预先感谢您提供的任何帮助!使用Kerberos身份验证的ASP.NET HttpWebRequest

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(); 
    } 

编辑:我觉得我应该多解释一下我试图做的事情。我一直负责为我公司的Google Search Appliance提供新界面。我使用的是一个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不会出现在我的网络凭据它...

+0

你还没有提到你在哪里运行你的客户端。它是一个控制台应用程序,aspx应用程序等? – feroze 2010-09-15 01:23:29

+0

对不起...这是一个aspx应用程序 – 2010-09-15 12:53:18

+0

我猜你没有正确的Active Directory设置......需要在两台服务器之间设置一些信任设置 – 2011-06-17 16:45:14

回答

0

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)还是别的。

+0

好吧,刚刚发现一个新的打嗝时尝试步骤1与提琴手...它需要连接到https://链接,而不是http://。我尝试将我的连接网址更改为https://但它确实没有什么区别(实际上,https:// url仍可与未经身份验证的GSA通话一起使用,所以我真的怀疑这是问题所在)。不知道这是否会影响您提供的其他步骤。 – 2010-09-16 13:51:19

+0

使用小提琴手时,当我直接从GSA尝试成功时,在标题信息中看不到任何WWW-Authenticate。 – 2010-09-16 13:57:36

+0

在#3上,是的,它们位于同一个域中。 – 2010-09-16 13:58:05