GetListItems“请求失败,HTTP状态401:未授权”
问题描述:
我有一个asp.net web应用程序,但未启用ssl,并在启用ssl的sharepoint 2010站点上使用lists.asmx。我已将lists.asmx添加为名为“myref”的Web引用。GetListItems“请求失败,HTTP状态401:未授权”
我正在使用的代码如下:
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文件设置在窗口
- 如果我输出WindowsIdentity.GetCurrent.name并禁用getlistitems调用我可以看到,它通过服务器或本地机器访问时明确地具有我的详细信息。
任何想法为什么会发生这种情况?
答
这由kerberos代表团解决。在Active Directory下的授权选项卡中,信任此计算机以委派任何服务(仅限Kerberos)选项已被选中。
花了几个小时后,对于其实际然后开始工作,但(我认为它应该是约30秒内,但花了长于出于某种原因)。