5

IIS で独自のカスタム認証を使用しており、 (ファイルの種類に関係なく) ページが読み込まれるたびにサーバーが最初に Application 変数をチェックして、ユーザーが認証され、サイトを表示する権限があるかどうかを確認します。global.asax では、次のようになります。

void Application_Start(Object Sender, EventArgs e)
{
  if(Application["username"] == null)
  {
    Response.redirect("login.aspx");
  }
}

問題は、このサイトに複数のサブルートがあることです。つまり、http://example.com/site1はhttp://example.com/site2 とはまったく異なる Web サイトです。したがって、前述の Application_Start 関数は site1 で機能するが、site2 には影響しないようにしたいと思います。

global.asax がディレクトリ レベルでカスタマイズ可能であれば、これは問題になりません。しかし、サーバーごとに global.asax が 1 つしかないため、このソリューションを実装することはできません。

global.asax に代わるものは何ですか? または、ディレクトリごとにglobal.asaxが何らかの形で異なる可能性がありますか?

4

3 に答える 3

10

HttpModules は global.asax の代替です

( https://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htm
http://codebetter.com/blogsも参照してください。 /karlseguin/archive/2006/06/12/146356.aspx )

HttpModules は web.config に登録されています。これは便利なことに、ディレクトリ レベルでカスタマイズできます。そのため、すべてのディレクトリは独自のモジュール セットを持つことができます (下位ディレクトリに継承されます)。すべてのモジュールには、 global.asax にあるものと同じ機能があります。

基本的に、すべてのページ リクエストは、実際のページ コード自体に到達する前に、すべての登録済みモジュールを通過します。これは、リクエストの種類に関係なく発生します。

「page.aspx」「page.html」
    | | | |
( | モジュール 1 | )
( | モジュール 2 | )
( | モジュール 3 | )
    VV
(ハンドラ 1) (ハンドラ 2)

((はるかに優れた図と説明は、https://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htmにあります。 )))

そのため、コードを global.asax ではなくモジュールとして定義するだけです。ユーザーが認証されていない場合:response.redirect("login.aspx")コントロールがハンドラーに到達し、要求されたページの解析/戻り/実行を停止します。

それよりも少し複雑なので、より良い説明/チュートリアルが codeguru Web サイトにあります。

于 2008-11-21T04:08:51.190 に答える
1

あなたのコードは、1 人のユーザーがログインすると全員にアクセスを許可することになると確信しています。

http://msdn.microsoft.com/en-us/library/ms178473.aspxによると:

「ASP.NET アプリケーションの最初のリソース (ページなど) が要求されたときに呼び出されます。Application_Startメソッドは、アプリケーションのライフ サイクル中に1 回だけ呼び出されます」

さらにhttp://support.microsoft.com/kb/307598#1によると、 「アプリケーションの状態変数は、事実上、各 ASP.NET アプリケーションのグローバル変数です。」

組み込みのメンバーシップ API を使用し、web.config ファイルを使用してアクセスを制限することをお勧めします。

独自の認証メカニズムを展開するのではなく、Membership API を使用することにオープンな場合は、web.config を使用して、ユーザーが特定のフォルダーに対して承認されているかどうかを確認できます。また、認証チケットを共有することで、比較的簡単にユーザーを 1 つのサイトにログインさせ、他のサイトに自動的にログインさせることもできます (それらがすべて同じルート ドメインにある場合)。

認証チケットの共有については、http: //msdn.microsoft.com/en-us/library/ms998288.aspxおよびhttp://www.netomatix.com/development/singlesignon.aspxを参照してください。

web.config を使用してアクセスを制限する方法: http://www.devhood.com/Tutorials/tutorial_details.aspx?tutorial_id=85

于 2008-11-21T06:34:59.477 に答える
0

実際、asp.netアプリケーションごとにglobal.asaxは1つだけだと思います。example.com/subsite1をexample.com/subsite2とは異なるアプリケーションにする場合は、IISで2つの異なるアプリケーションを作成できます。その結果、それらは完全に異なるアプリケーションドメインで実行されます(ただし、同じプロセス(aspnet_wp.exeまたはw3wp.exe)にあり、アプリケーションプールを共有する場合もあります)。そのため、それらが異なるアプリケーションである場合は、独立したglobal.asaxファイルも取得する必要があります。

ディレクトリをアプリケーションに変えること。[IIS]->[ディレクトリ/サブサイトの検索]を開き、右クリック->[プロパティ]->[ホームディレクトリ]タブ->[作成]をクリックします。

アプリケーションドメインとワーカープロセスの詳細については、このブログエントリを読むことを検討してください。お役に立てば幸いです。

于 2009-02-10T09:03:03.537 に答える