Новый проект Asp.Net MVC5 создает бесконечный цикл для входа в систему
Я создаю новый проект с Visual Studio 2013, я выбираю Asp.Net MVC и фреймворк 4.5.1. Проект создан, тогда я делаю ничего, кроме F5, чтобы запустить веб-страницу по умолчанию. К сожалению, он создает перенаправление на страницу входа, которая также перенаправляется на страницу входа. Вот короткая версия url, которую я имею в браузере:
http://localhost:5285/Account/Login?ReturnUrl=%2FAccount%2FLogin%3FReturnUrl%3D%252FAccount%252FLogin%253FReturnUrl%253D%25252FAccount%25252FLogin%25253FReturnUrl%25253D%2525252FAccount%2525252FLogin%2525253FReturnUrl%2525253D%252525252FAccount%252525252FLogin%252525253FReturnUrl%252525253D%25252525252FAccount%25252525252FLogin%25252525253FReturnUrl%25252525253D%2525252525252FAccount%2525252525252FLogin%2525252525253FReturnUrl%2525252525253D%252525252525
У меня нет ошибок в средстве просмотра событий. Но на экране я вижу:
"Ошибка HTTP 404.15 - не найден Модуль фильтрации запросов настроен на отказ в запросе, где строка запроса слишком длинная.
Веб-сайт работает со значением по умолчанию в IIS Express. Как я могу исправить эту проблему? Я предполагаю, что что-то не так с моей Visual Studio 2013?
Изменить
Он работает, если я создаю новый веб-сайт, и я его размещаю в IIS. Но если я создаю новый веб-сайт (не изменяя ничего) и просто нажимаю игру (которые запускают IIS Express по умолчанию), это не так.
Изменить 2
Я удалил все веб-сайты в Documents\IISExpress\config\applicationhost.config. Я перекомпилировал все, и он создал эту запись:
<siteDefaults>
<logFile logFormat="W3C" directory="%IIS_USER_HOME%\Logs" />
<traceFailedRequestsLogging directory="%IIS_USER_HOME%\TraceLogFiles" enabled="true" maxLogFileSizeKB="1024" />
</siteDefaults>
<applicationDefaults applicationPool="Clr4IntegratedAppPool" />
<virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>
Я все еще получаю сообщение об ошибке с IIS Express, а не с IIS.
Ответы
Ответ 1
Помните, что это потенциально опасный совет, редко рекомендуется изменять конфигурационный файл приложенияhosthost, обычно есть инструменты, которые сделают это для вас безопасно (например, из Visual Studio. ) Прежде чем продолжить, обязательно создайте резервную копию этого файла в случае, если ваш IIS Express будет поврежден.
Чтобы устранить эту проблему, я взял файл конфигурации IIS по умолчанию, расположенный здесь:
C:\Windows\System32\inetsrv\config\applicationHost.config
В мой документ
%userprofile%\documents\iisexpress\config\applicationhost.config
И это сработало.
Это было связано с тем, что у меня установлен набор Authentification для Windows, а не анонимная учетная запись.
Ответ 2
Выделите проект в Visual Studio
Откройте панель "Свойства" справа (или нажмите F4)
Установите "Аутентификация Windows" на "Отключено"
Установите "Анонимная аутентификация" на "Включено"
Ответ 3
Эта проблема возникает из-за выбранного режима проверки подлинности (по умолчанию) шаблона MVC 5, который запускает стиль перенаправления ReturnUrl, который может привести к бесконечному циклу, если он не настроен правильно.
Чтобы отключить обнаружение запуска OWIN, добавьте этот ключ в свой файл webconfig.
<add key="owin:AutomaticAppStartup" value="false"/>
Ответ 4
Вам не хватает атрибута [AllowAnonymous]
при действии входа.
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
// code....
}
Вторая возможность, специфичная только для IIS Express: это то, что если вы создали один и тот же проект по умолчанию WebApplication1
несколько раз, играя с разными настройками аутентификации, IIS Express сохранил дополнительные параметры аутентификации в этом файле конфигурации, Что-то вроде:
<location path="WebApplication1">
<system.webServer>
<security>
<authentication>
<windowsAuthentication enabled="true" />
<anonymousAuthentication enabled="false" />
</authentication>
</security>
</system.webServer>
</location>
</configuration>
Конфигурации находятся в папке "Документы пользователя" Documents\IISExpress\config\
, и вы должны искать:
applicationhost.config
Затем просто удалите xml node <location path="WebApplication1">
, упомянутый выше.
Обновление для VS 2015 +
Если вы используете Visual Studio 2015 или выше, проверьте этот путь для файла конфигурации:
$(solutionDir)\.vs\config\applicationhost.config
Каждое решение будет иметь свой собственный файл конфигурации.
Ответ 5
Мне пришлось удалить (Source Link):
<authorization>
<deny users="?" />
</authorization>
Ответ 6
Я знаю, что могу опаздывать, и это не относится непосредственно к вопросу ОП. Но если кто-нибудь в будущем придет сюда, еще одна проверка атрибута AllowAnonymous
и Authorize
заключается в том, что вы должны также проверить все дочерние действия.
Например, у меня был мой макет (который также использует страница входа), которые вызывают 2 дочерних действия для панировочных сухарей и боковых панелей, и у них не было атрибута AllowAnonymous
(у атрибута Controller был атрибут Authorize
).
Надеюсь на эту помощь.
Ответ 7
В IIS выберите веб-сайт и проверьте наличие аутентификации. Если вы используете аутентификацию форм, тогда -
- Установите "Аутентификация Windows" на "Отключено",
- Установите "Анонимная аутентификация" на "Включено"
- Установите "Аутентификация форм" на "Включено"
Ответ 8
Я столкнулся с той же проблемой, потому что мой проект MVC был настроен для .Net 4.5, но я использовал .Net 4.0 как пул приложений в IIS. Включил его в пул приложений .Net 4.5, и проблема была исправлена. Надеюсь, это поможет кому-то еще!
Ответ 9
TL: DR? Не вызывайте защищенный веб-API (любой веб-API, который требует авторизации) с страницы авторизации, такой как ~/Account/Login (которая сама по себе НЕ делает этого.). Если вы это сделаете, вы войдете в бесконечный цикл перенаправления на стороне сервера.
Причина
Я обнаружил, что виновник был, косвенно, AccountController::Authorize
и тот факт, что AccountController
украшен [Authorize]
.
Основная причина заключалась в том, что Sammy() вызывается из HomeViewModel() (строка 6 home.viewmodel.js), к которому обращался "защищенный веб-API". Это делалось для /Account/Login, в результате чего /Account/Login перенаправлялся на себя.
Подтверждение
Вы можете подтвердить, что это является причиной вашей проблемы несколькими способами:
- Украсьте
AccountController::Authorize
с помощью [AllowAnonymous]
- Прокомментируйте вызовы Sammy(), сделанные при построении viewmodel.
Решение
Решение должно было только выпустить пакет приложений (a.k.a "~/bundles/app" ) для просмотров, которые уже требовали авторизации. По моим сведениям/учетные записи/представления являются классическими представлениями на основе MVC и не являются частью приложения datamodel/viewmodel, но я ошибочно перевел вызов пакета Scripts.Render(@"~/bundles/app")
в _Layout.cshtml(вызывающий вызовы защищенного веб-API для все виды MVC, включая/Account/.)
Ответ 10
Шаблон ASP.Net MVC 5 добавляет в проект Microsoft.Owin и связанные с ним библиотеки. Поскольку для инфраструктуры Owin не требуется проверка подлинности с помощью форм, шаблон также вводит следующий ключ в web.config.
<system.webServer>
<modules>
<remove name="FormsAuthentication" />
</modules>
</system.webServer>
Наличие этого ключа может быть причиной нежелательного перехода на страницу входа. Комментируя это может помочь решить проблему для некоторых людей.
Ответ 11
в моем случае: в моем _layout.cshtml я использую Html.Action для вызова Action из Authorize Controller: ex: Html.Action( "Count", "Product" ) → ошибка цикла
fix: украсить атрибутом [AllowAnonymous] в этом Action (или удалить этот хелпер Html из _layout)
Ответ 12
Я просто занимался этой проблемой в течение нескольких часов подряд.
Для меня это было в файле Startup.Auth.cs.
Этот код при комментировании остановил цикл перенаправления.
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login")
});
Ответ 13
Убедитесь, что в конвейере нет действий, имеющих атрибут authorize.
В моем случае у моего макета был диспетчер меню навигации, в котором отсутствовал атрибут allowAnonymous.
Ответ 14
Я решил ту же проблему благодаря принятому ответу: Реферирование входа в ASP.NET, когда пользователь не участвует в роли.
Возможно, что контроллер, содержащий действие входа, украшен AuthorizeAttribute
(даже обычным), в то время как действие входа не украшено атрибутом AllowAnonymous
. Извлечение AuthorizeAttribute
из контроллера и добавление AllowAnonymous
к действию входа в систему может быть возможным решением.
Ответ 15
Эти ответы - более или менее части одной и той же головоломки; Я постараюсь положить все в одном месте.
Проблема, описанная в OP, поразила мое приложение в тот момент, когда я реализовал конвейер OWIN и идентификатор AspNET.
Итак, посмотрим, как это исправить...
Я думаю, вам это нужно, потому что, если вы этого не сделаете, вам не нужна аутентификация, и я думаю, что да.
Кроме того, вы используете аутентификацию в старом стиле, и я думаю, вы этого не делаете.
Поэтому не удаляйте атрибут запуска OWIN...
[assembly: OwinStartupAttribute(typeof(YourApp.Probably_App_Start.SomethingLikeAuthConfig))]
... или строка конфигурации...
<add key="owin:AppStartup" value="YourApp.Probably_App_Start.SomethingLikeAuthConfig" />
- Ограничение доступа к контроллерам
Теперь мы очистили это, вам нужна аутентификация. Это означает, что каждому из ваших контроллеров нужен атрибут [Authorize]
, или вы можете сделать то же самое со всеми контроллерами в одном месте, зарегистрировав предмет в глобальном масштабе (например, в RegisterGlobalFilters()
, добавьте строку filter.Add(new AuthorizeAttribute())
).
В первом случае (при закреплении каждого контроллера отдельно) пропустите эту часть, просто перейдите к следующей.
В последнем случае все ваши контроллеры будут защищены от несанкционированного доступа, поэтому вам нужна точка входа для этого разрешения - незащищенного действия Login()
.
Просто добавьте...
[AllowAnonymous]
... и вы должны быть хорошими.
- Конфигурация cookie OWIN
Когда ваш пользователь входит в систему, его браузер хранит зашифрованный (надеюсь,!) файл cookie, чтобы упростить работу системы. Итак, вам нужен файл cookie - не удаляйте строку, которая говорит UseCookieAuthentication
.
- Вам действительно нужно отключить встроенный механизм аутентификации IIS для вашего веб-приложения. Это означает отключение
Windows Authentication
(Отключено) и включение доступа к любому пользователю, по крайней мере, до тех пор, пока IIS Express в настоящее время обеспокоен установкой Anonymous Authentication
(Enabled).
Когда вы запустите свой веб-сайт, это, в свою очередь, скопирует эти настройки в конфигурацию IIS Express (applicationhost.config
), и там вы увидите две строки:
<windowsAuthentication enabled="false" />
<anonymousAuthentication enabled="true" />
-
У вас может быть конфиг авторизации в вашем web.config, который говорит deny users="?"
. Это означает, что подсистема авторизации получает указание запретить анонимным пользователям вводить данные.
С OWIN это все еще работает так, как было разработано. Вам либо нужно удалить это, либо сделать ваш анонимный пользователь доступным для входа на страницу входа, используя что-то вроде...
<location path="Account/Login">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
НТН
Ответ 16
У меня были аналогичные проблемы, когда он был в бесконечном цикле при обратном вызове на сайт. Оказывается, при локальной локализации он перенаправлял порты. Я обновил номера портов на экране свойств проекта, но оставил определение Azure одинаковым в облачном проекте, и все начало работать, как ожидалось.
Ответ 17
У меня была такая же проблема с моим проектом Asp.Net MVC 4. Я решил это, перейдя в Startup.cs и закомментировав строку для ConfigureAuth (app)
public void Configuration(IAppBuilder app)
{
//ConfigureAuth(app);
}
Я также удостоверился, что в моем IIS для моего проекта включена проверка подлинности Windows, а все другие параметры проверки отключены.
Ответ 18
Для меня это оказалось вызвано моим LoginViewModel, содержащим ссылки на файлы ресурсов перевода, которые, по-видимому, защищены аутентификацией. Я удалил эти ссылки, и проблема была решена.
Ответ 19
Для меня удаление следующего блока исправлено:
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
Предположим
<authentication mode="None" />
Ответ 20
Для меня я конвертировал проект, который раньше был Windows-аутентификацией, в проект, в котором использовалась структура идентификации с учетными записями. После нескольких часов борьбы с этой бесконечной проблемой перенаправления и пробуя каждое предложение здесь, оказалось, что мне просто нужно было очистить мои куки в браузере, и тогда все работало как ожидалось.
Ответ 21
в моем случае это была очень запутанная проблема, я украсил домашний контроллер несуществующей ролью. так что это вызывает петлю перенаправления.
Ответ 22
Перейдите в свой файл applicationhost.config и установите anonymousauthentication = "true"
<authentication>
<anonymousAuthentication enabled="true" userName="" />
<windowsAuthentication enabled="true">
<providers>
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
</authentication>