0

私はsslが有効になっているsharepoint 2010サイトでlists.asmxを使用して、sslが有効になっていないasp.net Webアプリケーションを持っています。「myref」と呼ばれる Web 参照として、lists.asmx を追加しました。

私が使用しているコードは以下のとおりです。

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

それは正常に動作します。問題は、ハードコードされたユーザー ID ではなく、asp.net サイトにアクセスしているユーザーのログオン詳細を渡したいことです。

asp.net サイト サーバーに直接ログオンし、localhost/sitename/pagename.aspx を介して直接アクセスすると、ローカル マシンのブラウザーでは機能しない同じコードが正常に機能しますが、事態を複雑にします。

Web サーバーでアプリケーション イベント ログを確認すると、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 に答える