문제

다음은 SharePoint 문서 라이브러리에 폴더가 있는지 확인하는 데 사용되는 2 개의 코드 스 니펫입니다. PropFind 방법은 작동하는 것처럼 보이지만 다른 방법은 헤드를 사용하여 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;
}
도움이 되었습니까?

해결책

내 두 센트 :

WebDav가 작동하는 방식과 관련이 있다고 생각합니다.

  • Webdav는 "도전 / 응답"프로토콜이기 때문에 첫 번째 요청은 항상 익명으로 전송됩니다. 인증 헤더가없는 첫 번째 요청이 필요합니다. Webdav의 응답에는 다음 요청을 검증하기위한 Nonce가 포함되어 있으며 예를 들어 공격에 대한 편향을 돕습니다. (답변에서 이 질문, 자세한 내용은 답변 링크를 참조하십시오).

  • IE의 "로컬 인트라넷"구역에서 액세스하려는 사이트입니까? 그렇지 않은 경우 다음은 문제에 대한 자세한 정보와 가능한 위라운드를 제공 할 수 있습니다.

왜 그런 일이 발생하는지 이해합니다

Internet Explorer를 사용하여 WebDav 사이트에 액세스하면 Internet Explorer는 Windstp (Windows HTTP Services)를 사용합니다. WINHTTP는 인증 된 로그온 프로세스 중에 로컬 인트라넷 사이트에서 발생하는 요청에 응답하여 사용자 자격 증명을 보냅니다. 그러나 WinHTTP는 인터넷 익스플로러의 보안 영역 설정을 확인하여 웹 사이트가 로컬 인트라넷 사이트인지 확인하지 않습니다. 대신 Winhttp는 인터넷 익스플로러의 프록시 설정에 따라 웹 사이트가 로컬 인트라넷 사이트인지 확인합니다.

자동으로 감지 된 설정 옵션이 활성화되지 않은 경우 정의 된 자동 구성 스크립트는 처리되지 않습니다. WINHTTP는 WebDAV 사이트를 로컬 인트라넷 사이트로 식별하지 않습니다. 따라서 WinHTTP는 사용자 자격 증명없이 요청을 보내며 사용자 자격 증명을 입력하라는 메시지가 표시됩니다.

보시다시피,이 문제는 인트라넷 사이트가 아닌 엑스트라 넷 사이트에만 나타나는 것 같습니다. 불행히도 많은 고객들이 대리인이없는 상태로 전국에서 지구 물리학 적 솔루션을 운영합니다. 에서 여기.

다른 팁

요청은 401을 생성하지 않았습니다. 401은 서버에서 나왔습니다. 서버의 Windows 이벤트 로그, IIS 로그 및 SharePoint 로그를보고 서버가 401을 반환 한 이유를 확인해야합니다.

응답이 실제로 유효하고 401은 여기에서 괜찮다고 생각합니다. 401은 "무단"을 의미합니다. 따라서 리소스에 액세스하려고 할 때 SharePoint는 먼저 자격 증명을 확인하여이를 수행 할 수 있는지 확인하십시오. 액세스 할 수없는 경우 401을 반환합니다. 그렇게하면 요청한 내용의 200 개 이상의 내용을 반환합니다.

이제 둘의 차이점은 무엇입니까?

  • 자원을 요구할 때 액세스 할 수 없습니다.
  • 존재하지 않는 자원을 요구할 때

SharePoint의 기본 원칙은 - 당신이 사물에 액세스 할 수 없다면, 당신에게 존재하지 않으며 그것이 존재하는지 아닌지 알지 못해야합니다.

SharePoint에 액세스 할 수없는 리소스를 찾을 수 있으면 http://sharepointsite/docs/JL_Gets_A_Salary_bonus.doc 급여 보너스가 있는지 확인합니다.

그렇기 때문에 액세스 할 수없는 리소스와 존재하지 않는 리소스에 대해 "액세스 거부"를받는 이유입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top