TIPS: DataFormWeb パーツでサイトコレクションを跨いだ _vti_bin/Lists.asmx Web サービスを参照してもダブルホップ問題は発生しない

先日のプロジェクトで、NTLM 認証を設定している環境で、別サイト内のカレンダーリストを一覧表示する方法について、とある SharePoint MVP 受賞の技術者の人 (M男) とこんな会話がありました。

私「DataFormWeb パーツで、Lists.asmx の GetSiteCollection メソッドを参照させて、あとは XSLT で処理すれば簡単にできるのではないか」
M男「ダメダメ。ダブルホップの問題でできないよ。」
私「RSS パーツはそうだろうけど、仕組みが違うので可能性あるよ。IIS にだってログが残らないから、通常のリクエストパイプラインを通ってない可能性がある。」
M男「絶対無理でしょ。DLL 開発じゃないと」

どちらが正しいか

結論から言うと、できます。ダブルホップの問題は起きません。
結果は下記の通りです。

DataForm Web パーツで別のサイトコレクションの _vti_bin/Lists.asmx を参照してリスト一覧を出力。
DataForm Web パーツで別のサイトコレクションの _vti_bin/Lists.asmx を参照してリスト一覧を出力。
Web パーツなのでエクスポートと再配置も可能
RSS ビューア Web パーツはダブルホップ問題により読み込むことはできない

これは、ダブルホップの問題を正しく理解している必要があります。

ダブルホップ問題について

NTLM 認証のダブルホップの問題は、NTLM 認証がチャレンジ – レスポンス方式であるが故、コンポーネントが NTLM による再認証が必要になったとき、プレーンなパスワードを保有していないため、サーバーが送ってくるチャレンジコードに対してレスポンスコードを生成できないから発生します。
仮に同一セキュリティコンテキスト内で動くものならダブルホップ問題は発生しません。
これは、再リクエストするコンポーネントの内部の実装次第になります。

各パーツの認証

RSS ビューア Web パーツは正式名称は RSSAggrigatorWebPart です。これは、XmlUrlDataSource クラスをデータソースに持っています。

<SharePoint:XmlUrlDataSource runat="server" HttpMethod="GET" SelectCommand="" AuthType="None" XPath="">

DataForm Web パーツは、SoapDataSource クラスをデータソースに持ちます。

<DataSources>
  <SharePoint:SoapDataSource runat="server" id="SoapDataSource2" AuthType="None" 
     WsdlPath="http://portal.contoso.com/site3/_vti_bin/lists.asmx?WSDL" 
     SelectUrl="http://portal.contoso.com/site3/_vti_bin/lists.asmx"
     SelectAction="http://schemas.microsoft.com/sharepoint/soap/GetListCollection" SelectPort="ListsSoap12" 
     SelectServiceName="Lists">
           <SelectCommand>
       <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><GetListCollection xmlns="http://schemas.microsoft.com/sharepoint/soap/"/></soap:Body></soap:Envelope>
        </SelectCommand>
   </SharePoint:SoapDataSource>
   </DataSources>

この時点で、認証の仕方が違う可能性があることを考慮に入れなければなりません。

それぞれどのように動くでしょうね。開発元でないと分からないかもしれません。
認証部分ではなく、単にフロントエンド部分ではじいてるだけかもしれません。だから検証が必要なのです。
「自サーバーの URL を参照するとダブルホップ問題が起こる」と、脊髄反射で考えるのはダメです

ちなみにもう1点付け加えると、SLB 負荷分散などで他サーバーにアクセスする可能性がある URL を指定している場合はわかりません。さらにその環境で検証が必要でしょう。

もう一度言います。
Lists.asmx サービスを DataFormWeb パーツで参照すると、NTML 認証のサイトでもダブルホップの問題は起きません。


おまけ

下記のログが、サイトコレクション /site3 のリストを読み込む DataFormWebParts を配置した /site2 への IIS アクセスログですが、IIS (192.168.11.21) 間のアクセスも、401,401,200 の3つセットなので、NTLM に見えます。そしてしっかり同一ユーザーで認証しています。どうやってるのでしょうね。やはり思い込みで決めつけるにはまだ早いようです。

192.168.11.55 はドメイン メンバーではないクライアントの IP アドレス

コメントを残す