Asp.net core Identity успешный вход в систему, перенаправление обратно на страницу входа

У меня проблема, когда структура идентификации asp.net перенаправляет пользователя обратно на страницу входа после того, как они успешно вошли в систему.

Используется стандартный идентификатор ядра Asp.net. Это версия 2.1.1. Леса, из которых создаются бритвенные страницы. Не уверен, что это важно.

Я знаю, что пользователь успешно входит в систему, потому что я получаю сообщение журнала

... Areas.Identity.Pages.Account.LoginModel: Информация: Пользователь вошел в систему.

Но затем он перенаправляется обратно на страницу входа.

Если я использую скрипач, я вижу, что в запросе есть файл cookie, поэтому с этой точки зрения все выглядит хорошо.

.AspNetCore.Identity.Application=CfDJ8KJxkuir9ZJIjFLCU2bzm9n6X...

Итак, я предполагаю, что промежуточное ПО, которое обрабатывает аутентификацию, но не принимает cookie?

Если бы я мог видеть, что действительно делает промежуточное ПО для аутентификации, у меня могла бы быть идея, но я не могу ее найти.

Любая помощь приветствуется


person Jero    schedule 30.07.2018    source источник


Ответы (6)


Чтобы конвейер ASP.NET Core распознал, что пользователь вошел в систему, требуется вызов UseAuthentication в методе Configure вашего класса Startup, например:

app.UseAuthentication();
app.UseMvc(); // Order here is important (explained below).

При использовании схемы аутентификации с помощью файлов cookie использование UseAuthentication в общих чертах выполняет следующее:

  • Считывает содержимое .AspNetCore.Identity.Application cookie из запроса, который представляет личность пользователя, выполняющего запрос.
  • Заполняет свойство User элемента HttpContext значением ClaimsPrincipal, которое представляет указанного пользователя.

Это упрощенное объяснение того, что происходит, но оно подчеркивает важную работу, которую выполняет промежуточное программное обеспечение аутентификации. Без промежуточного программного обеспечения аутентификации .AspNetCore.Identity.Application не будет использоваться для аутентификации пользователя и, следовательно, пользователь не будет аутентифицирован. В вашем случае, хотя пользователь вошел в систему (т.е. устанавливается cookie), промежуточное программное обеспечение конвейера (например, MVC) не видит этого пользователя (т.е. cookie не читается) и поэтому видит неаутентифицированный запрос и снова перенаправляет для авторизоваться.

Учитывая, что промежуточное программное обеспечение аутентификации считывает cookie и впоследствии заполняет ClaimsPrincipal, должно быть ясно, что вызов UseAuthentication также должен быть перед вызовом UseMvc, чтобы это произошло в правильном порядке. В противном случае промежуточное ПО MVC запускается перед промежуточным ПО аутентификации и не будет работать с заполненным ClaimsPrincipal.

Почему не удается войти в систему, если вы не добавили промежуточное ПО, которое обрабатывает вход?!?

Промежуточное ПО не обрабатывает вход в систему - оно обрабатывает процесс аутентификации. Пользователь вошел в систему, что подтверждается наличием .AspNetCore.Identity.Application cookie. Что здесь не удается, так это чтение указанного файла cookie.

person Kirk Larkin    schedule 31.07.2018

Обратите внимание, что порядок ВАЖЕН. Я перевернул их и столкнулся с той же проблемой, что и оригинальный плакат. Часы потрачены впустую, прежде чем я понял это ...

    app.UseAuthentication();
    app.UseAuthorization();
person John81    schedule 16.01.2020

В дополнение к ответу @Kirk Larkin, если вы используете .net core 3 (на этот раз это предварительная версия)

поместите "app.UseEndpoints" в startup.cs в конец блока кода.

например, это должно быть в таком порядке

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });
person İsmail Hakkı Şen    schedule 14.08.2019

app.UseAuthentication (); app.UseMvc ();

Это уже было в моем коде, но я столкнулся с той же проблемой. Но в моем случае проблема была в браузере Chrome, который работал с другим браузером, например, с Mozilla. Он начинает работать и в Chrome после того, как я очистил все файлы cookie и кеши.

person Gopal Dahal    schedule 16.08.2019

Мне пришлось сделать пару таких решений.

Во-первых, у меня было app.UseAuthentication (); и app.UseAuthorization (); в неправильном порядке.

Во-вторых, после внесения изменений в startup.cs я все еще испытывал ту же проблему. Выполнение жесткого обновления несколько раз исправило это (также можно просто очистить кеш браузера).

person Michael Buchok    schedule 11.08.2020

Я пробовал много предложений, и, наконец, у меня сработало следующее: во-первых, в своем классе ConfigureServices в Startup.cs добавьте это

services.AddMvc().AddMvcOptions(Mvcoption => {
            Mvcoption.EnableEndpointRouting = false;
        });

Приведенный выше код должен появиться после этого:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                .AddCookie(options =>
                {
                    options.LoginPath = "/Home/Login";


                });

На всякий случай, если у вас нет двух вышеуказанных кодов, попробуйте включить их в свое приложение mvc. Затем вы можете продолжить и добавить их в свой метод настройки.

app.UseAuthentication();
        app.UseMvc();

Надеюсь, теперь это сработает.

Удачного кодирования!

person Chidi-Nwaneto    schedule 26.05.2020