Вход перенаправляет на вход после входа в систему?Microsoft MVC Framework - PullRequest
2 голосов
/ 24 октября 2011

Когда я впервые захожу на сайт по URL-адресу: http://mysite.com/myapp, Я перенаправлен на страницу входа, но returnUrl - "/myapp".

Как мне убедиться, что при первом посещениион перенаправляет на страницу входа, но обратный URL-адрес отличается от самой страницы входа, например, "~ / Home / Index".

Я попытался добавить маршруты. MapRoute, передав пустую строкупараметр "url", и в объект, переданный в "значения по умолчанию", я включаю значение для элемента returnUrl как "~ / Home / Index", но это ни на что не влияет.

Я пытался создатьдокумент по умолчанию и обеспечение полного анонимного доступа к нему на странице входа, но это тоже не работает ... он всегда перенаправляет и добавляет returnUrl самой страницы входа, что немо.Это, похоже, проблема с поведением системы маршрутизации по умолчанию, когда защита свойств установлена.

Ответы [ 2 ]

2 голосов
/ 25 октября 2011

Я понял это.

Механизм безопасности IIS по умолчанию для защиты страниц (т. Е. Раздел system.web / authorization) бесполезен при использовании MVC, потому что с MVC вы не защищаете реальные физические страницы или пути, а скорее контроллеры и действия, на которые ссылаются виртуальные пути называется "маршруты".

Вместо того, чтобы защищать все одной строкой в ​​web.config, вы должны не забыть добавить атрибут [Authorize] для каждого действия, которое вы хотите защитить (или для каждого класса контроллера, для которого вы хотите, чтобы все действия были защищены), потому что все доступно по умолчанию. Это означает, что ваша безопасность основана на коде в MVC, а не на web.config, поэтому вы не можете изменить настройки без перекомпиляции.

Точная проблема заключалась в том, что я защищал корневой каталог приложения с помощью раздела авторизации и не смог добавить исключения для физических подпутей ... потому что на самом деле их нет в MVC ... все это обрабатывается маршрутизацией модуль. Поэтому при посещении корня без каких-либо исключений модуль проверки подлинности с надписью говорил «нет, вы не можете получить доступ к корневому пути» и немедленно обслуживал страницу входа в систему и добавлял перенаправление обратно в защищенный корень.

Обычно при наличии маршрута по умолчанию перейти к Account / LogOn было бы хорошо, потому что Account / LogOn имеет код для перенаправления на Home / Index в отсутствие returnUrl. Однако в этом случае раздел авторизации вызывал генерирование returnUrl при аутентификации форм, что сводило на нет способность действия Account / LogOn выполнять перенаправление по умолчанию. Изменение маршрута по умолчанию на Home / Index решило эту проблему; однако это привело к тому, что URL браузера стал неправильным, и именно тогда я столкнулся с проблемой определения URL как «../Content/image.jpg», а не @ Url.Content («~ / Content / image.jpg»).

Итак, как вы можете видеть, это была сложная, многогранная проблема, возникшая в результате столкновения архитектур.

См .: Проблема с авторизацией с IIS и MVC

и

См .: Как разрешить всем пользователям доступ к одному маршруту на веб-сайте с интегрированной аутентификацией?

Подводя итог, можно сказать, что хорошими предложениями были: 1: маршрут по умолчанию должен идти домой, а не вход в систему, 2: убедитесь, что среда генерирует URL-адреса содержимого относительно корня приложения, 3: добавьте к действию http-get страницы входа a перенаправить на дом, если Request.IsAuthenticated имеет значение true, и 4: использовать атрибут [Authorize] для защиты методов действия.

1 голос
/ 24 октября 2011

Вам не нужно изменять маршрут, чтобы заставить его работать правильно. Для вашей «аутентификации» необходимо выполнить действия, гарантирующие их атрибут [Authorize].

При аутентификации по формам это перенаправит пользователей на loginUrl, указанный в вашей конфигурации:

<system.web>
  <authentication mode="Forms">
    <forms loginUrl="Login.aspx" />
  </authentication>
</system.web> 

После аутентификации информация о исходной странице будет помещена в строку запроса, используя RETURNURL в качестве ключа.

Edit: В проверке результата действия контроллера / myapp проверьте, аутентифицирован ли пользователь с помощью Request.IsAuthenticated . Если аутентифицировано, и возвращаемым URL является «/ myapp» (вторая проверка может не потребоваться), перенаправьте их на нужный контроллер / действие.

Edit2: Контроллер / действие по умолчанию указывается в вашем global.asax. Например:

routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

Это должно быть то место, куда вы перенаправляете с RedirectToRouteResult.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...