C # Web Dav, почему запрос головы генерирует 401? - PullRequest
1 голос
/ 05 января 2010

Ниже приведены 2 фрагмента кода, используемые для проверки наличия папки в библиотеке документов SharePoint. Метод 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 ]

1 голос
/ 06 января 2010

Мои два цента:

Я думаю, это связано с тем, как работает WebDAV:

  • первый запрос всегда отправляется анонимно, потому что WebDAV является протоколом «запрос / ответ». Этот первый запрос без заголовков авторизации необходим; ответ от WebDAV содержит одноразовый номер для проверки следующего запроса, помогая отразить, например, атаки повторного воспроизведения. (из ответа на этот вопрос , см. ссылки в ответе для получения дополнительной информации).

  • Является ли сайт, к которому вы пытаетесь получить доступ, в своей зоне «Местная интрасеть» в IE? Если нет, следующее может дать дополнительную информацию о вашей проблеме и возможной ситуации:

Понимание, почему это происходит

Когда вы используете Internet Explorer для получить доступ к сайту WebDAV, Интернет Проводник использует Windows HTTP Services (WinHTTP). WinHTTP отправляет пользователя учетные данные только в ответ на запросы, которые происходят на местном интранет сайт во время аутентификации процесс входа в систему. Тем не менее, WinHTTP делает не проверять настройки зоны безопасности в Internet Explorer определить является ли веб-сайт локальной интрасетью сайт. Вместо этого WinHTTP зависит от настройки прокси в Internet Explorer для определить, является ли веб-сайт местный интранет-сайт.

Если автоматически определять настройки опция не включена, любая скрипт автоконфигурации, который определенный не будет обработан. WinHTTP не будет идентифицировать сайт WebDAV как местный интранет сайт. Следовательно, WinHTTP отправит запрос без учетных данных пользователя, и вы будете будет предложено ввести учетные данные пользователя.

Итак, как вы можете видеть, эта проблема только кажется, появляются на сайте Extranet и не на сайте Интранет. к несчастью многие из моих клиентов работают геофизически решения по всей стране без прокси между. С здесь .

0 голосов
/ 06 января 2010

Я думаю, что ответ действительно действителен, и 401 здесь в порядке. Смотри, 401 означает «неавторизованный». Поэтому, когда вы пытаетесь получить доступ к ресурсу, SharePoint сначала проверяет ваши учетные данные, чтобы узнать, разрешено ли вам это делать. Если у вас нет доступа, он вернет 401, если вы это сделаете, он вернет 200+ содержимого того, о чем вы просили.

Теперь, в чем разница между ними:

  • когда вы запрашиваете ресурс, у вас нет доступа к
  • когда вы запрашиваете ресурс, который не существует

Основной принцип в SharePoint - если у вас нет доступа к какой-либо вещи, она НЕ СУЩЕСТВУЕТ для вас, и вы НЕ ДОЛЖНЫ знать, существует она или нет.

Если SharePoint разрешил вам ГОЛОВИТЬ ресурс, к которому у вас нет доступа, вы можете попробовать найти http://sharepointsite/docs/JL_Gets_A_Salary_bonus.doc, чтобы узнать, есть ли у вас бонус к зарплате или нет.

Вот почему вы получаете «отказ в доступе» как к ресурсам, к которым у вас нет доступа, так и к ресурсам, которых нет.

0 голосов
/ 05 января 2010

Запрос не сгенерировал 401. 401 пришел с сервера. Вы должны посмотреть журналы событий Windows, IIS и SharePoint на сервере, чтобы понять, почему сервер вернул 401.

...