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

时间:2010-09-14 14:54:58

标签: asp.net httpwebrequest kerberos

我正在尝试连接到使用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();
    }

编辑:我觉得我应该多解释一下我想要做的事情。我的任务是为我公司的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似乎没有我的网络凭据......

1 个答案:

答案 0 :(得分:0)

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

2)如果#1有效,那么GSA在第一个未经身份验证的请求上发送的WWW-Authenticate标头是什么?

3)ASPX应用程序运行的机器是否与GSA所在的AD域相同? AFAIK这可能是成功授权所必需的。

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

在我看来,您应该首先将代码建模到您运行和调试的控制台应用程序中。然后将其移植到ASPX页面。通过这种方式,您将能够知道故障是由于主机(ASPX与控制台)还是其他原因造成的。