1

編集 7:
結局、これは実行できないと思います。何らかのコマンド ライン アプリケーションを使用してこれを実行し、出力を解析する必要があるかもしれませんが、多くの人がアクセスしている場合、これは非常に遅くなる可能性がありますフォルダおよび/または NetBIOS セッションの制限に達しています。

編集 6:
Windows 統合認証 (共有とデータベースにアクセスできるアカウントを使用) を使用すると、ファイル/ディレクトリのリストを取得できます。ただし、ページを更新してUnauthorizedAccessException. おそらく、NetBIOS または ActiveDirectory の制限です。

5か月、「偽装を使用する」以外の解決策はまだありません(組み込みの.NETの方法が非常に不安定に見えるため、P/Invokeを介してそう思われます)が、それにも同じ問題があります。ユーザー名/パスワードのハードコーディングはオプションではありません。

開発 (Windows 7) ボックス (IIS または Visual Studio を使用) に組み込まれた Web サーバー) は正常に動作します。

編集 5:
インターネットとこの質問で読んだことから、これが機能する唯一の方法は次のとおりです。

  • 基本認証
  • なりすまし
  • Web アプリケーションと同じサーバーにファイルがある

これらはどれもオプションではありません。

  • ユーザーは毎回ログインする必要があります - 欠点: 追加の障壁があり、シームレスなエクスペリエンスにする必要があります
  • ユーザー名とパスワードがハードコードされている - 欠点: パスワードが変更されると、コード化されたユーザー (asp.net アカウント) はファイルにアクセスできなくなります
  • Web サーバーに保存するファイルが多すぎます。ディスク容量が不足しています

UNC 共有ファイルにアクセスできる Windows フォーム アプリケーションが必要なので、これでうまくいくと思っていました。それと、Web サーバーにリモート接続して Windows エクスプローラーを使用すると、ファイルにアクセスできるという事実。

おそらく、ASP.NET/IIS のセキュリティにより、P/Invoke による偽装なしでは機能しなくなります。または、ファイアウォールによってブロックされている可能性がありますか?

編集 4:
機能することの 1 つは、基本認証を使用することです。統合 Windows 認証とダイジェスト認証は機能しません。ただし、パスワードは平文で送信され、ユーザーがページにアクセスするとプロンプトが表示されるため、これは実際にはオプションではありません (私がやりたいことではありません)。

編集3:
何を試しても、UNCパス上のファイルまたはディレクトリのリストを取得できません(これらの組み合わせと個別にオンになっています)

  1. フォルダーへの「Everyone」フルアクセス (読み取りだけでなく) が与えられます
  2. ASP.NET アカウントが「オペレーティング システムの一部として機能する」場合
  3. 指定された IIS_WPG グループが「オペレーティング システムの一部として機能する」
  4. 使用済み<authentication mode="Windows" />
  5. 使用済み<identity impersonate="true"/>

サイトへのログインに使用するのと同じアカウントでサーバーに (RDP を使用して) リモート接続すると、ファイルに問題なくアクセスできます。コードでは機能しません。

編集2:
私が試したことは次のとおりです:

  1. Windows 認証をオンにします。ファイルは同じマシン (UNC 共有ではない) にある場合にのみアクセスでき、データベースに接続できません。
  2. フォーム認証をオンにすると、データベースに接続できますが、ファイルにはアクセスできません ( InvalidCastExceptionID が になったためGenericIdentity)

ロールを追加する方法がないため、Windows 認証を使用できません。ユーザー名/パスワードの入力を求めたくないのは、これは追加の手順であり、安全な接続 (SSL など) を介していないためです。また、ASP.NET アカウントにファイルへのアクセス権を与えることもできません (私はドメイン管理者ではないため)。

編集:
パスは UNC パスであり、ローカル PC 上ではありません。

フォーム認証を使用してWindowsIdentity、Visual Studio で現在のユーザー ID を にキャストしてデバッグしようとすると、InvalidCastException. 私は単に持っています:

WindowsIdentity id = (WindowsIdentity)HttpContext.Current.User.Identity;

次に、私が得るエラーは次のとおりです。

Unable to cast object of type 'System.Security.Principal.GenericIdentity' to type 'System.Security.Principal.WindowsIdentity'

ASP.NET アカウントはこれらのファイルにアクセスできないため、偽装を使用してファイルのリストを取得しています。IIS を使用している場合は機能しますが、Visual Studio では機能しません。

WindowsIdentity id = (WindowsIdentity)User.Identity;
using (System.Security.Principal.WindowsImpersonationContext context = id.Impersonate())
{
 files = Directory.GetFiles("\\server\share");
 context.Undo();
}

に追加<identity impersonate="true" />してweb.configも何も実行されませんが、ASP.NET アカウントを使用してデータベースにクエリを実行しているため、実行したくありませんが、ユーザーにはアクセス権がありません (結果としてLogin failed for user 'NT AUTHORITY\ANONYMOUS LOGON')。

web.config を介して Windows 認証をオンにするUnauthorizedAccessExceptionと、リモート共有からファイルのリストを取得しようとすると取得されます (クライアント PC の同じユーザーとして IIS ボックスにリモート接続した場合は、そうでなければアクセスできます)。

さらに、ASP.NET アカウントは Active Directory でセットアップされたアカウントであり、IIS に対してローカルではありません。

4

2 に答える 2

1

RichardOD が言うように、IIS と WebDev の両方で与えられたコードを実行すると問題が発生します。

最適なオプションは、[プロジェクト] > [プロパティ] > [Web] > [ローカル IIS Web サーバーを使用する] です。

それ以外の場合は、アクセス制御戦略を変更する必要があります。

コメントに応じて編集:OPはハードコアな偽装を行う必要があるようです:

過去にこのコードを使用して、分離コードから別のユーザーとして UNC に接続しました。見栄えの良い最新バージョンもありますが、使用していないため保証できません。

これは役立つかもしれませんが、そうでないかもしれません。試すだけの価値があります。

于 2010-02-23T15:21:34.890 に答える
0

組み込みの Web サーバー (Cassini) を使用するということですか? なりすましは、IIS と同じようには機能しません (「カッシーニは有害である」を参照)。IIS を Visual Studio の Web サーバーとして使用できます。このような奇妙な展開時間の問題を防ぐため、私は通常そうします。

于 2010-02-23T15:24:01.947 に答える