2016-01-14 4 views
0

В событии Session_Start он вызывает класс authenticate_authorize для возврата объекта AuthResult.Request.RedirectToRoute в Session_Start заставляет сеанс перезапускать

public AuthResult 
 
{ 
 
    public enumAuthResult Result {get;set;} 
 
    public string Controller {get;set;} 
 
    public string Action {get;set;} 
 
}
Если результат не enumAuthorized, контроллер и действие возвращается к session_start. Затем, если Request.RedirectToRoute() используется для маршрутизации на действие контроллера, Session_Start будет находиться в бесконечном цикле. Кажется, что RedirectToRoute() всегда перезапускает сеанс. Вместо этого, если используется Request.Redirect(), то правильное действие контроллера запускается нормально.

  1. Каков правильный способ вызова действия контроллера без использования переадресации в событии Session_Start?

  2. Должен ли я разделить аутентификацию и авторизацию в событиях Application_AuthenticateRequest и Application_AuthorizeRequest отдельно?

  3. Если аутентификация и авторизация выполняются в отдельных событиях, как передать объект AuthResult событию Session_Start, чтобы он мог правильно перенаправить или перенаправить на контроллер?

Response.RedirectToRoute(AuthResult.Controller, AuthResult.Action); 
 
Response.Redirect(string.Format("{0}/{1}",AuthResult.Controller, AuthResult.Action));

ответ

1

Что такое правильный способ вызова действия контроллера без использования перенаправления в session_start случае?

Правильный способ заключается в использовании Authorization Filter, который запускается после того, как действие было выбрано. Microsoft включила реализацию по умолчанию, AuthorizeAttribute, которая удовлетворяет потребности большинства пользователей с помощью пользователей/ролей, но может быть наследована, если вам нужно создать пользовательскую схему.

AuthorizeAttribute использует интерфейсы IPrincipal и IUser, которые могут быть реализованы с помощью любой пользовательской схемы безопасности и реализованы с использованием членства в ASP.NET и идентификатора ASP.NET.

Если вы попытаетесь настроить свою безопасность по URL-адресам, почти невозможно гарантировать, что каждый маршрут к действию будет проходить через вашу схему безопасности. Например, по умолчанию к домашней странице можно обращаться через /, /Home или /Home/Index, поэтому, если ваша авторизация только на основе URL-адреса составляет только /, пользователь сможет обойти вашу безопасность и получить доступ к вашему домашнему действию через /Home или /Home/Index.

Я бы рекомендовал не создавать собственную схему безопасности - для этого требуется опыт, который у вас нет на основе вашего вопроса. Вместо этого вы должны просмотреть MVC security overview, чтобы найти лучший вариант для своего приложения, а затем пройти учебник, в котором объясняется, как его реализовать. Обратите внимание, что идентификатор ASP.NET заменяет членство ASP.NET.

+0

Спасибо. Я пытаюсь сделать аутентификацию и авторизацию один раз в начале приложения, например, запуск сеанса. Использование Authroization Filter заставит меня украсить каждый контроллер этим атрибутом. У нас много приложений на нашем сайте IIS.Я даже планирую написать HttpModule для перехвата запросов на уровне сайта до того, как обработчик MVC будет выполнен, чтобы мы могли систематически внедрять аутентификацию/авторизацию на уровне сайта и не допустить, чтобы каждый разработчик приложения из этой мирской задачи в своем коде приложения. – user266909

+0

Вам не нужно украшать каждое действие контроллера с помощью AuthorizeAttribute. Вы можете зарегистрировать его как глобальный фильтр только один раз в файле FilterConfig. На самом деле, это рекомендуемый способ сделать это, а затем использовать AllowAnonymous atttribute, чтобы выборочно разрешить части вашего сайта, которым не нужна безопасность. – NightOwl888

Смежные вопросы