none
webclientを使用したファイル共有サーバーへのアクセス RRS feed

  • 質問

  • [環境]
    サーバー:IIS 7.5
    開発環境:VS2010


    [仕組み]
    クライアント → サーバーAに以下の手順でアクセスし、
    ファイルサーバー内のファイルをダウンロードする。

    サーバーA:
     ファイルサーバー
     サーバーBからAPI:WebClient.DownloadDataでファイルアクセスされる
     ファイル配置フォルダはEveryoneの権限を設定

    サーバーB:
     クライアントのインターフェイスサーバー
     クライアントからWCF経由でリクエストされる
     サーバーAへWebClientでファイルアクセスを行い、binaryデータを取得する

    クライアント
     サーバーAのファイルをダウンロードするために、
     WCFを使用しサーバーBにアクセス
     アクセス対象のファイルをuri形式(file://\\A\・・・)でWCFのサービス関数に指定


    [質問内容]
    クライアント→サーバーBへリクエストを実施すると、
    サーバーB→サーバーAの間で「アクセス権が拒否される」 
    といったエラーが発生します。

    1.本エラーを出さないための解決方法をご教授いただけませんでしょうか
    2.実際はサーバーAに対して特定のユーザー(ソースにサーバーAへのアクセス)のみ

     アクセスを許可するような仕組みにしたいのですがどういった設定を追加すればよろしいでしょうか。


    [確認事項]
    ・サーバーBのWCFをhostしているIISのapplication poolの実行ユーザーを
     Admin もしくは domain userに変更するとアクセスは出来る

    ・IISの偽装設定(inpersonate = true user、、、)を指定する
     問題解決する場合があると記載を見たので試みましたが、効果は無かった

    ・サーバーB内でWebClientの指定URIを自分のディレクトリにした場合(
     file://c:\・・・)アクセスは可能ですが、
     (file://\\A\・・・)とするとエラーが発生

    ・サービスをWCFではなくASP.NETで実行したところ同様の問題が発生(WCF起因ではないよう。。。)

     

    2012年6月23日 6:30

すべての返信

  • 関係あるかわかりませんが参考までに書いておきます。

    Windowsの偽装はスレッド単位で行われます。子スレッドを起動したりThreadPoolを使ったりすると、偽装を引き継ぎます。非同期実行を使用とすると.NET 1.0 / 1.1では引き継いでいませんでした。.NET 2.0からは引き継ぐようになっているそうです。これを設定する<legacyImpersonationPolicy>がアプリケーション構成ファイルにあります。

    ここから本題ですが、ASP.NETでは偽装を引き継がない設定になっています。WCFなどでASP.NET上で非同期実行を使ってしまうと偽装内容が引き継がれずApplication Poolの実行ユーザーで実行されてしまいます。
    # 非同期実行したとは書かれていませんでしたが、もしそうならこの条件に該当しそうです。

    2012年6月23日 12:03
  • 佐祐理さま

    ご回答ありがとうございます。

    非同期実行の件に関してですが、今回は設定しておりません。

    2012年6月24日 6:37