0

我在启用了 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调用,我可以看到它在通过服务器或我的本地计算机访问时肯定有我的详细信息。

知道为什么会这样吗?

4

1 回答 1

1

kerberos 委托解决了这个问题。在“委托”选项卡下的 Active Directory 中,选择了信任计算机以委托给任何服务(仅限 Kerberos)选项。

在那之后它花了几个小时才真正开始工作(我认为它应该在大约 30 秒内,但由于某种原因需要更长的时间)。

于 2012-08-07T10:15:17.297 回答