私は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呼び出しを無効にすると、サーバーまたはローカル マシン経由でアクセスしたときに、間違いなく詳細が含まれていることがわかります。
なぜこれが起こっているのですか?