какие есть альтернативы использованию global.asax?

Я использую собственную настраиваемую аутентификацию в 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 работала на сайте1, но не влияла на сайт2.

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

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


person Alexander Bird    schedule 21.11.2008    source источник


Ответы (3)


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.

person Alexander Bird    schedule 21.11.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

person Nathan    schedule 21.11.2008

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

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

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

person Tyler    schedule 10.02.2009