GetListItems“请求失败,HTTP状态401:未经授权”

时间:2012-07-27 16:10:56

标签: asp.net sharepoint-2010 impersonation

我在启用了ssl的sharepoint 2010网站上使用lists.asmx启用了没有启用ssl的asp.net Web应用程序。我已将lists.asmx添加为名为“myref”的Web引用。

我正在使用的代码如下:

Web.config片段

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

aspx代码

<%@ 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

它工作正常。 问题是我想通过访问asp.net站点的用户登录的详细信息,而不是硬编码的用户ID。

如果我在本地计算机上的浏览器上无效的相同代码可以正常工作,如果我直接登录到asp.net站点服务器并通过localhost / sitename / pagename.aspx直接访问,那么复杂化。

检查Web服务器上的应用程序事件日志会显示以下网页未显示的额外信息:

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

对我来说似乎表明它试图使用网络服务连接到Web服务而不是登录用户详细信息,除非您直接登录到服务器。

  • asp.net应用程序具有Windows身份验证(非匿名)
  • 需要将Windows身份验证传递给sharepoint Web服务
  • 直接登录到Web服务器时,无法通过本地计算机工作的代码正常工作
  • 在web.config文件中启用了模拟(虽然如果您将其关闭,则不会出现任何错误,但您也无法从sharepoint返回任何项目)
  • web.config文件中的身份验证模式在Windows
  • 中设置
  • 如果我输出 WindowsIdentity.GetCurrent.name 并停用 getlistitems ,我可以看到它在通过服务器或本地计算机访问时肯定会有我的详细信息。< / LI>

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

这是由kerberos代表团解决的。在 DELEGATION 标签下的Active Directory中,选择了信任此计算机以便委派任何服务(仅限Kerberos)选项。

之后花了几个小时才实际开始工作(我认为它应该在30秒左右但由于某种原因需要更长的时间)。