2012-07-27 1 views
0

ssl이 활성화 된 SharePoint 2010 사이트에서 lists.asmx를 사용하여 ssl을 사용하지 않고 asp.net 웹 응용 프로그램을 사용할 수 있습니다. lists.asmx를 "myref"라는 웹 참조로 추가했습니다.GetListItems "요청이 HTTP 상태 401 : 권한이 없습니다"

내가 사용하는 코드는 다음과 같습니다 :

의 Web.config 내가 위를 사용하는 경우

<system.web> 
     <identity impersonate="true"/> 
     <authentication mode="Windows"/> 
     .......... 
    </system.web> 

는 영문 코드

<%@ Import Namespace="System" %> 
<%@ Import Namespace="System.IO" %> 
<%@ Import Namespace="System.Net" %> 
<%@ Import Namespace="System.xml" %> 
<%@ Import Namespace="myref" %> 
<% 
Dim xmlDoc As XmlDocument = New System.Xml.XmlDocument() 
Dim myQuery As XmlNode = xmlDoc.CreateNode(XmlNodeType.Element, "Query","") 
myQuery.InnerXml = "<Where><Eq><FieldRef Name='_ModerationStatus' /><Value Type='ModStat'>2</Value></Eq></Where>" 
Dim myViewFields As XmlNode = xmlDoc.CreateNode(XmlNodeType.Element, "ViewFields","") 
myViewFields.InnerXml ="<FieldRef Name='_Status' /><FieldRef Name='owshiddenversion' />" 
Dim myQueryOptions as XmlNode= xmlDoc.CreateNode(XmlNodeType.Element, "QueryOptions","") 
myQueryOptions.InnerXml = "<Folder>my list</Folder>" 

Dim mylist As new myref.Lists() 
mylist.UseDefaultCredentials = true 
mylist.PreAuthenticate = True 

Dim ndLists As XmlNode = mylist.GetListItems("my list","",myQuery,myViewFields,100,myQueryOptions,"") 
Response.Write(ndLists.outerxml) 
%> 

나는 오류가 니펫을 :

Line 514:  [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://schemas.microsoft.com/sharepoint/soap/GetListItems", RequestNamespace="http://schemas.microsoft.com/sharepoint/soap/", ResponseNamespace="http://schemas.microsoft.com/sharepoint/soap/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] 
Line 515:  public System.Xml.XmlNode GetListItems(string listName, string viewName, System.Xml.XmlNode query, System.Xml.XmlNode viewFields, string rowLimit, System.Xml.XmlNode queryOptions, string webID) { 
Line 516:   object[] results = this.Invoke("GetListItems", new object[] { 
Line 517:   listName, 
Line 518:   viewName, 

내가 사용하는 경우 :

Dim cache As CredentialCache = New CredentialCache() 
cache.Add(New Uri(mylist.Url), "Negotiate", New NetworkCredential("userid", "password", "domain")) 

대신 잘 작동

mylist.UseDefaultCredentials = true 

의. 문제는 하드 코딩 된 사용자 ID가 아닌 asp.net 사이트에 액세스하는 사용자의 로그온 세부 정보를 전달하려고합니다.

asp.net 사이트 서버에 직접 로그온하고 localhost/sitename/pagename.aspx를 통해 직접 액세스하면 내 로컬 컴퓨터의 브라우저에서 작동하지 않는 동일한 코드가 제대로 작동하지만 문제가 발생합니다.

Thread account name: NT AUTHORITY\NETWORK SERVICE 
Is impersonating: False 

의 연결하는 네트워크 서비스를 사용하려고 시도하는 것을 보여주기 위해 보인다 나에게 : 웹 서버의 응용 프로그램 이벤트 로그를 확인

웹 페이지가 표시되지 않는 다음과 같은 추가 정보를 보여줍니다 서버에 직접 로그온 한 경우를 제외하고는 로그인 된 사용자 세부 정보가 아닌 웹 서비스에 연결됩니다.

  • asp.net 응용 프로그램은
  • Windows 인증은 SharePoint 웹 서비스에 전달 될 필요가 (익명되지 않음)에 Windows 인증을 가지고
  • 로그인 할 때 로컬 시스템을 통해 작동하지 않는 코드는 잘 작동
  • web.config 파일에서 가장이 활성화되어 있지만 해제해도 오류가 발생하지 않지만 공유 지점에서 항목을 가져 오지는 않지만
  • web.config 파일의 인증 모드 창에 설정 됨
  • WindowsIdentity.GetCurrent.name을 출력하고 getlistitems 호출을 비활성화하면 서버 또는 로컬 컴퓨터를 통해 액세스 할 때 내 세부 정보가 분명히 표시됩니다.

왜 이런 일이 발생하는지 알고 싶습니다.

답변

1

이것은 kerberos 위임에 의해 해결되었습니다. DELETATION 탭 아래의 Active Directory에서 모든 서비스에 대한 위임을 위해이 컴퓨터 트러스트 (Kerberos 만 해당) 옵션이 선택되었습니다.

실제로 작업을 시작하기까지 몇 시간이 걸렸습니다 (약 30 초 내에 있어야했지만 어떤 이유로 그보다 오래 걸렸을 것이라고 생각합니다).