Какие есть альтернативы использованию global.asax? - PullRequest
5 голосов
/ 21 ноября 2008

Я использую свою собственную пользовательскую аутентификацию с IIS и хочу, чтобы сервер при каждой загрузке страницы (независимо от типа файла) сначала проверял переменную приложения, чтобы убедиться, что пользователь аутентифицирован разрешено видеть сайт. В 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. Поэтому я хотел бы, чтобы указанная функция Application_Start работала на site1, но не влияла на site2.

Если global.asax можно настраивать на уровне каталогов, то это не будет проблемой. Но поскольку на сервер имеется только один global.asax, я не могу реализовать это решение.

Какие альтернативы есть у global.asax? или может global.asax как-то отличаться для каждого каталога?

Ответы [ 3 ]

10 голосов
/ 21 ноября 2008

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"
    |             |
(   |  module 1   |  )
(   |  module 2   |  )
(   |  module 3   |  )
    V             V
(handler 1) (handler 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.

1 голос
/ 21 ноября 2008

Я почти уверен, что ваш код разрешит доступ всем после входа в систему одного человека - вероятно, не того, что вы хотите.

Согласно http://msdn.microsoft.com/en-us/library/ms178473.aspx:

"Вызывается, когда запрашивается первый ресурс (например, страница) в приложении ASP.NET. Метод Application_Start вызывается только один раз в течение жизненного цикла приложение "

Кроме того, в соответствии с http://support.microsoft.com/kb/307598#1 «Переменные состояния приложения, по сути, являются глобальными переменными для каждого приложения ASP.NET».

Я бы предложил вам использовать встроенный членский API и ограничить доступ с помощью файлов web.config.

Если вы открыты для использования API членства вместо использования собственного механизма аутентификации, вы можете использовать web.config, чтобы проверить, авторизован ли пользователь для определенной папки. Вы также можете относительно просто зарегистрировать пользователя на одном сайте и автоматически войти на другие сайты, поделившись билетами аутентификации - при условии, что они все находятся в одном корневом домене.

Для обмена билетами аутентификации см .: 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

0 голосов
/ 10 февраля 2009

На самом деле, я считаю, что на каждое приложение asp.net есть только один global.asax. Если вы хотите, чтобы example.com/subsite1 отличался от приложения example.com/subsite2, вы можете создать два разных приложения в IIS. В результате они будут работать в совершенно разных доменах приложений (хотя они могут находиться в одном и том же процессе (aspnet_wp.exe или w3wp.exe) и даже совместно использовать пулы приложений). Таким образом, если это разные приложения, они также должны иметь независимые файлы global.asax.

Чтобы превратить каталог в приложение. Откройте IIS-> Найдите каталог / подузел, щелкните правой кнопкой мыши -> Свойства -> вкладка Домашний каталог -> Нажмите «Создать».

Для получения дополнительной информации о доменах приложений и рабочих процессах рассмотрите чтение этой записи в блоге . Надеюсь, это поможет.

...