Новий проект Asp.Net MVC5 створює нескінченний цикл для входу на сторінку входу


77

Я створюю абсолютно новий проект за допомогою 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.

Відповіді:


66

Виділіть проект у Visual Studio

Відкрийте панель "Властивості" праворуч (або натисніть F4)

Встановіть для параметра «Автентифікація Windows» значення «Вимкнено»

Встановіть для параметра «Анонімна автентифікація» значення «Увімкнено»


4
ключ - встановити "Анонімну автентифікацію" на "Увімкнено"
відвертий

16
Але що, якщо я дійсно хочу, щоб автентифікація Windows була ввімкнена і анонімна автентифікація вимкнена. Це пов’язано з тим, що я хочу отримати інформацію про вхід користувача Windows у програму інтрамережі.
Девід

Привіт Роб, це не властивості проекту Visual Studio. Це налаштування в диспетчері IIS. Налаштування їх вирішило проблему для мене.
Джон Елдрідж,

Вирішив моє питання !! Дякую!!
wadefanyaoxia

37

Вам не вистачає [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

Потім просто видаліть <location path="WebApplication1">згаданий вище вузол xml .


Оновлення для VS 2015+

Якщо ви використовуєте Visual Studio 2015 або новішої версії, перевірте цей шлях для файлу конфігурації: $(solutionDir)\.vs\config\applicationhost.config

Кожне рішення матиме власний конфігураційний файл.


Ні. Це там за замовчуванням, і я нічого не змінив.
Patrick Desjardins

Дозвольте спробувати Дайте мені кілька хвилин
Патрік Дежардін,

Я оновив запитання. Видалення вузла xml не вирішує проблему.
Патрік Дежардін

1
Не siteрозділ, це окремий locationрозділ унизу файлу. І шукайте назву вашого додатка.
Ненад

1
@Nenad Я просто витратив години на вирішення цієї проблеми. Я здогадувався, що ваша відповідь - це моє рішення, але applicationhost.configфайл у Documentsпапці не посилався на мій проект, тому я відмовився від цього підходу - рішення, як виявилося, було передчасним. Дійсно, ваша відповідь була правильною, однак розташування файлу змінилося в нових версіях Visual Studio (2015+). Тепер файл знаходиться в кореневому каталозі рішення. Я оновив вашу відповідь, включивши цю нову інформацію. Дякую.
Lopsided

36

Ця проблема пов’язана з режимом автентифікації, вибраним (за замовчуванням) шаблоном MVC 5, який ініціює стиль перенаправлення ReturnUrl, який може призвести до нескінченного циклу, якщо неправильно налаштовано.

Щоб вимкнути виявлення запуску OWIN, додайте цей ключ у свій файл webconfig.

<add key="owin:AutomaticAppStartup" value="false"/>

6
Ого, це вирішило проблему для мене. Як на Землі хтось мав це знайти? Дякую аміго.
ввести в дію

Це вирішило і мою проблему! Як на Землі ...? Хтось хоче поділитися, що це таке? EDIT: ну, це більше не переспрямовує на сторінку входу і замість цього показує помилку 401?
Luke Vo

1
що якщо мені потрібен автозапуск owin? (фактично я створив стартап.cs)
Джогі

1
Тепер я можу ввійти, але це викликало у мене проблему при виході з системи. Для мене це не оптимальна відповідь. Все одно, дякую.
Доктор МАФ

1
це в налаштуваннях додатків?
Rez.Net

7

Мені довелося видалити ( Джерело посилання ):

<authorization>
  <deny users="?" />
</authorization>

Після оновлення командою nuget update-package це була моя проблема ... дивно, що оновлення додало ці рядки до web.config
Dragouf

Це дуже цікаво, тому що для мене був інший шлях. Мені довелося додати це, щоб це працювало!
Exel Gamboa

7

Я знаю, що можу запізнитися, і це не безпосередньо для питання ОП. Але якщо хтось у майбутньому прийде сюди, ще одна перевірка AllowAnonymousі Authorizeатрибут полягає в тому, що ви також повинні перевірити всі дочірні дії .

Наприклад, я мав макет (який також використовує сторінка входу), який викликає 2 дочірні дії для сухарів та бічної панелі, і вони не мали AllowAnonymousатрибута (атрибут Controller мав Authorize).

Сподіваюся, це допоможе.


Мені знадобилося дві години, щоб знайти вашу відповідь, а потім 2 хвилини, щоб знайти дочірню дію, приховану в нашому макеті, в якій відсутній атрибут AllowAnonymous.
nemesv

@nemesv Радий, що міг допомогти :) Дякую за щедрість!
Luke Vo

Мені потрібно було додати ViewModel і контролер для мого макета навігації. Відсутність дії [AllowAnonymous] у NavBarController Index () спричинило нескінченний цикл дії Login ().
Smitty-Werben-Jager-Manjenson

5

У IIS виберіть свій веб-сайт і перевірте наявність автентифікації. Якщо ви використовуєте автентифікацію за допомогою форм, тоді -

  1. Встановіть для параметра «Автентифікація Windows» значення «Вимкнено»,
  2. Встановіть для параметра «Анонімна автентифікація» значення «Увімкнено»
  3. Встановіть для «Форми автентифікації» значення «Увімкнено»

Я отримав цю помилку після того, як наша команда внесла деякі зміни у рішення. Ця відповідь мені так допомогла. Дякую.
Доктор МАФ

3

Шаблон ASP.Net MVC 5 додає до проекту Microsoft.Owin та пов'язані з ним бібліотеки. Оскільки інфраструктура Owin не вимагає автентифікації форм, шаблон також вводить такий ключ у web.config.

<system.webServer>
  <modules>
    <remove name="FormsAuthentication" />
  </modules>
</system.webServer>

Наявність цього ключа може бути причиною небажаного переходу на сторінку входу. Його коментар може допомогти усунути проблему деяким людям.


2

Я зіткнувся з тією ж проблемою, оскільки мій проект MVC був налаштований на .Net 4.5, але я використовував .Net 4.0 як свій пул додатків у IIS. Переключено на пул додатків .Net 4.5, і проблема була виправлена. Я сподіваюся, це допоможе ще комусь!


2

TL: АД? Не викликайте захищений веб-API (будь-який веб-API, який вимагає авторизації) зі сторінки авторизації, наприклад ~ / Account / Login (яка сама по собі цього НЕ робить.). Якщо ви це зробите, ви ввійдете в нескінченний цикл перенаправлення на стороні сервера.

Причина

Я виявив, що винним був, побічно, AccountController::Authorizeі той факт, що AccountControllerприкрашений [Authorize].

Основною причиною було виклик Sammy () з HomeViewModel () (рядок 6 home.viewmodel.js), який отримував доступ до "захищеного веб-API". Це робилося для / Account / Login, що призвело до перенаправлення / Account / Login на себе.

Підтвердження

Ви можете підтвердити, що це причина вашої проблеми, кількома методами:

  1. Прикрасьте AccountController::Authorizeз[AllowAnonymous]
  2. Прокоментуйте дзвінки Sammy (), зроблені під час побудови viewmodel.

Рішення

Рішення полягало в тому, щоб емітувати пакет додатків (він же "~ / bundles / app") лише для переглядів, які вже потребували авторизації. Наскільки мені відомо / Обліковий запис / подання - це класичні подання, засновані на MVC, і вони не є частиною додатку datamodel / viewmodel, але я помилково перемістив Scripts.Render(@"~/bundles/app")виклик пакета в _Layout.cshtml (в результаті чого захищені виклики веб-API здійснюються для всіх подань MVC , включаючи / Рахунок /.)


2

у моєму випадку: в моєму _layout.cshtml я використовую Html.Action для виклику дії з авторизованого контролера: наприклад: Html.Action ("Count", "Product") -> помилка циклу

виправлення: прикрасити атрибутом [AllowAnonymous] у цій дії (або видалити ці помічники Html із _layout)


2

Я просто вирішував це питання годинами поспіль.

Для мене це було у файлі Startup.Auth.cs.

Цей коментар, коментуючи, зупинив цикл перенаправлення.

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login")
        });

У моєму випадку мені залишалося лише прокоментувати "LoginPath = new PathString (" / Account / Login ")"
Райан Данфі,

2
Ви пропонуєте просто видалити всю функцію перенаправлення для входу. це не здається мені дійсним рішенням.
Похиблений

1

Будь ласка, майте на увазі, що це потенційно шкідлива порада. Рідко рекомендується змінювати конфігураційний файл applicationhost безпосередньо, як правило, є інструменти, які зроблять це за вас безпечно (наприклад, із Visual Studio.) Перш ніж продовжувати, переконайтеся, що створити резервну копію цього файлу на випадок, якщо IIS Express потрапить у кошик.

Щоб вирішити цю проблему, я взяв файл конфігурації IIS за замовчуванням, розташований тут:

C:\Windows\System32\inetsrv\config\applicationHost.config

До мого документа

%userprofile%\documents\iisexpress\config\applicationhost.config

І це спрацювало.

Це було тому, що у мене було встановлено певну автентифікацію Windows, а не анонімний обліковий запис.


це не спрацювало для мене, лише спричинило збій iisexpress при запуску
ozhug

1

Переконайтеся, що у вас немає дій у конвеєрі, які мають атрибут авторизації. У моєму випадку в моєму макеті був контролер меню навігації, у якому відсутній атрибут allowAnonymous.


1

Я вирішив ту саму проблему завдяки такій прийнятій відповіді: цикл перенаправлення входу ASP.NET, коли користувач не виконує роль .

Можливо, контролер, що містить дію Вхід, прикрашений AuthorizeAttribute(навіть нестандартною), тоді як дія входу не прикрашена AllowAnonymousатрибутом. Видалення AuthorizeAttributeз контролера та додавання AllowAnonymousдо дії входу може бути можливим рішенням.


Це може широко відкрити інші дії, які раніше були забезпечені.
Маріуш

1

Ці відповіді - це більш-менш шматочки однієї головоломки; Спробую розкласти все в одному місці. Проблема, яку описав OP, потрапила в мою програму в той момент, коли я впровадив конвеєр OWIN та ідентифікатор AspNET.

Тож давайте подивимось, як це виправити ...

  1. Запуск OWIN

Я думаю, вам це потрібно, бо якщо цього немає, то вам не потрібна автентифікація, і, мабуть, вам потрібна. Крім цього, ви використовуєте якусь автентифікацію за старим стилем, і, мабуть, ви цього не робите. Отже, не видаляйте атрибут запуску OWIN ...

[assembly: OwinStartupAttribute(typeof(YourApp.Probably_App_Start.SomethingLikeAuthConfig))]

... або рядок конфігурації ...

<add key="owin:AppStartup" value="YourApp.Probably_App_Start.SomethingLikeAuthConfig" />
  1. Обмеження доступу для контролерів

Тепер ми це з’ясували, вам потрібна автентифікація. Це означає, що кожному з ваших контролерів потрібен [Authorize]атрибут, або ви можете зробити те ж саме для всіх контролерів в одному місці, зареєструвавши річ глобально (наприклад, у RegisterGlobalFilters(), додайте рядок filter.Add(new AuthorizeAttribute())). У першому випадку (при захисті кожного контролера окремо) пропустіть цю частину, просто перейдіть до наступної. В останньому випадку всі ваші контролери будуть захищені від несанкціонованого доступу, тому вам потрібна точка входу для цього дозволу - незахищена Login()дія. Просто додайте ...

[AllowAnonymous]

... і ти повинен бути добрим.

  1. Конфігурація файлів cookie OWIN

Коли ваш користувач входить в систему, його браузер зберігає зашифрований (сподіваємось!) Файл cookie, щоб спростити роботу системи. Отже, вам потрібен файл cookie - не видаляйте рядок із написом UseCookieAuthentication.

  1. Потрібно виключити інтегрований механізм автентифікації IIS для веб-програми. Це означає вимкнути Windows Authentication(Вимкнено) і ввімкнути будь-якого користувача, принаймні до тих пір, поки це стосується IIS Express, встановивши Anonymous Authentication(Увімкнено).

Після запуску веб-сайту це, в свою чергу, скопіює ці налаштування у конфігурацію IIS Express ( applicationhost.config), і там ви побачите ці два рядки:

<windowsAuthentication enabled="false" />
<anonymousAuthentication enabled="true" />
  1. Можливо, у вас є конфігурація авторизації у вашому web.config, яка говорить deny users="?". Це означає, що підсистемі авторизації доручено запобігати входу анонімних користувачів. З OWIN це все ще працює за задумом. Вам потрібно або видалити це, або зробити анонімному користувачеві доступ до сторінки входу, використовуючи щось на зразок ...

    <location path="Account/Login"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location>

HTH


0

У мене були подібні проблеми, коли це було в нескінченному циклі при передзвоненні на веб-сайт локально. Виявляється, при локальній налагодженні він перенаправляв порти. Я оновив номери портів на екрані властивостей проекту, але залишив визначення Azure однаковим у хмарному проекті, і все почало працювати, як очікувалося.


0

У мене була та ж проблема з моїм проектом Asp.Net MVC 4. Я вирішив це, перейшовши на Startup.cs і прокоментувавши рядок для ConfigureAuth (додаток)

    public void Configuration(IAppBuilder app)
    {
        //ConfigureAuth(app);
    }

Я також переконався, що в моєму проекті увімкнено автентифікацію Windows у IIS, а всі інші параметри автентифікації вимкнено.


0

Для мене це виявилося спричиненим моїм LoginViewModel, що містить посилання на файли ресурсів перекладу, мабуть, захищеними аутентифікацією. Я видалив ці посилання, і проблема була вирішена.


0

Для мене вилучення наступного блоку це виправило:

<authorization>
  <deny users="?" />
  <allow users="*" />
</authorization>

Припустимо

<authentication mode="None" />

0

у моєму випадку це була дуже дротова проблема, я прикрасив домашній контролер неіснуючою роллю. тому це викликає цикл перенаправлення.


-1

Перейдіть до файлу applicationhost.config і встановіть anonymousauthentication = "true"

<authentication>

            <anonymousAuthentication enabled="true" userName="" />
            <windowsAuthentication enabled="true">
                <providers>
                    <add value="Negotiate" />
                    <add value="NTLM" />
                </providers>
            </windowsAuthentication>

        </authentication>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.