C#Web Dav,为什么头部请求会产生401?

时间:2010-01-05 19:05:08

标签: c# sharepoint-2007 webdav

以下是用于检查SharePoint文档库中是否存在文件夹的2个代码段。 PROPFIND方法似乎有效,而另一种方法,使用HEAD导致401.

有人可以告诉我为什么吗?不要被凭证分心,我在两个示例中都将它设置为相同,并且它工作正常....

以下是有效的代码:

// Create the web request object
var oReq = (HttpWebRequest)WebRequest.Create(url);

// Set the needed properties
oReq.Method = "PROPFIND";
oReq.Credentials = this.wsLists.Credentials; // Use same credentials as wsLists. 
oReq.AllowAutoRedirect = true;
oReq.UserAgent = "Microsoft-WebDAV-MiniRedir/6.1.7600";

// Enumerate through top level only, increasing the depth will find children.
oReq.Headers["Depth"] = "0";
oReq.Headers["translate"] = "f";
var oRequest = new StreamWriter(oReq.GetRequestStream());
oRequest.WriteLine();
oRequest.Close();
var oResponse = new StreamReader(oReq.GetResponse().GetResponseStream());
string sResponse = oResponse.ReadToEnd();
oResponse.Close();

这是违规代码:

private bool MossResourceExists(string url)
{
    var request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "HEAD";

    // Create a new CredentialCache object and fill it with the network
    // credentials required to access the server.
    var myCredentialCache = new CredentialCache();
    if (!string.IsNullOrEmpty(this.Domain ))
    {
        myCredentialCache.Add(new Uri(url),
       "NTLM",
       new NetworkCredential(this.Username , this.Password , this.Domain )
       );
    }
    else
    {
        myCredentialCache.Add(new Uri(url),
       "NTLM",
       new NetworkCredential(this.Username , this.Password )
       );
    }

    request.Credentials = myCredentialCache;

    try
    {
        request.GetResponse();
        return true;
    }
    catch (WebException ex)
    {
        var errorResponse = ex.Response as HttpWebResponse;

        if (errorResponse != null)
            if (errorResponse.StatusCode == HttpStatusCode.NotFound)
                return false;
            else
                throw new Exception("Error checking if URL exists:" + url + ";Status Code:" + errorResponse.StatusCode + ";Error Message:" + ex.Message ) ;
    }
    return true;
}

3 个答案:

答案 0 :(得分:1)

我的两分钱:

我认为这与WebDAV的工作方式有关:

  • 第一个请求始终是匿名发送的,因为WebDAV是一个“质询/响应”协议,第一个请求没有auth头是必要的; WebDAV的响应包含验证下一个请求的随机数,有助于避免例如重放攻击。 (从回答 this question ,请参阅答案中的链接以获取更多信息)。

  • 您尝试在IE中的“本地Intranet”区域中访问的网站是?如果没有,以下可能会提供有关您的问题以及可能的更多信息:

  

了解它为何会发生

     

使用Internet Explorer时   访问WebDAV站点,Internet   Explorer使用Windows HTTP服务   (WinHTTP的)。 WinHTTP发送用户   凭证仅用于响应   在本地发生的请求   经过身份验证的Intranet站点   登录过程。但是,WinHTTP确实如此   不检查安全区域设置   在Internet Explorer中确定   网站是否是本地Intranet   现场。相反,WinHTTP取决于   Internet Explorer中的代理设置   确定一个网站是否是一个   本地内部网站。

     

如果自动检测设置   选项未启用,任何   自动配置脚本   定义将不会被处理。 WinHTTP的   不会将WebDAV网站标识为   本地内部网站点。因此,   WinHTTP将发出请求   没有用户凭据,你会的   系统会提示您输入用户凭据。

     

所以你可以看到,这个问题只是   似乎出现在Extranet网站上   不在内联网网站上。不幸   我的许多客户都在运行地球物理   解决方案遍布全国各地   代理人介于两者之间。   来自here

答案 1 :(得分:0)

请求没有生成401.401来自服务器。您应该查看服务器上的Windows事件日志,IIS日志和SharePoint日志,以了解服务器返回401的原因。

答案 2 :(得分:0)

我认为响应实际上是有效的,401就可以了。看,401表示“未经授权”。因此,当您尝试访问资源时,SharePoint会首先检查您的凭据,以确定是否允许您执行此操作。如果您没有访问权限,它将返回401,如果您这样做,它将返回200多个您要求的内容。

现在,两者有什么区别:

  • 当您要求资源时,您无权访问
  • 当您要求不存在的资源时

SharePoint中的基本原则是 - 如果您无法访问某个内容,则它不会为您存在,您也不应该知道它是否存在。

如果SharePoint允许您使用HEAD获取您无权访问的资源,则可以尝试查找http://sharepointsite/docs/JL_Gets_A_Salary_bonus.doc以查看您是否有工资奖金。

这就是为什么你在没有访问权限的资源和不存在的资源上获得“访问被拒绝”的原因。