Asp.Net MVC 6 Проверка подлинности cookie - авторизация не выполняется

Я пытаюсь создать приложение asp.net core mvc 6, используя аутентификацию cookie Middleware. Мой код компилируется без ошибок, но даже после успешного входа я не авторизованный пользователь

Здесь моя конфигурация startup.cs

        app.UseCookieAuthentication(options =>
        {
            options.AuthenticationScheme = "CookieAuth";
            options.LoginPath = new PathString("/Account/Login/");
            options.AccessDeniedPath = new PathString("/Account/Login/");
            options.AutomaticAuthenticate = true;
            options.AutomaticChallenge = true;

        });

Также действие входа в контроллер:

   public async Task<IActionResult> Login(LoginViewModel model)
    {

        User foundUser = _userManager.findUser(model.UserName, model.Password);


        if (foundUser != null)
        {
            List<Claim> userClaims = new List<Claim>
            {
                new Claim("userId", Convert.ToString(foundUser.UserID)),
                new Claim(ClaimTypes.Name, foundUser.UserName),
                new Claim(ClaimTypes.Role, Convert.ToString(foundUser.RoleID))
            };

            ClaimsPrincipal principal = new ClaimsPrincipal(new ClaimsIdentity(userClaims));
            await HttpContext.Authentication.SignInAsync("CookieAuth", principal);


            return RedirectToAction("Index", "Dashboard");
        }
        return View();
    }

И наконец, действие Dashboard/Index

[Authorize]
public IActionResult Index()
{
    return View();
}

Я установил некоторые точки останова в действии входа, и все работает отлично. Cookie также установлен правильно.

И теперь я не знаю, как я не могу перейти на панель инструментов/индекс после входа в систему. Каждый раз, когда я перенаправляюсь в/Account/Login/из-за настроек конфигурации

Что я делаю неправильно?

Ответ 1

Когда вы создаете свой ClaimsIdentity в своем логине, вам нужно использовать другой конструктор, который указывает authenticationType.

Вместо

ClaimsPrincipal principal = new ClaimsPrincipal(new ClaimsIdentity(userClaims));

Вам следует:

ClaimsPrincipal principal = new ClaimsPrincipal(new ClaimsIdentity(userClaims, "local"));

Теперь можно создать ClaimsIdentity, у которого есть претензии, но с установкой IsAuthenticated в значение false. Фактически это значение по умолчанию теперь...

Чтобы установить IsAuthenticated в значение true, вам необходимо указать тип аутентификации

Я получил эту информацию из блога Dominick Baier здесь.

Существует также отличный пример использования промежуточного программного обеспечения cookie здесь, также (легендарный) Доминик Байер/наименее привилегированный.

EDIT:

Этот ответ содержит дополнительную информацию о том, что должно использоваться для строки authenticationType.