MVC AccountController с IsAuthenticated false OWIN

У меня есть AccountController с действием Login.

Мы подписываем пользователя в нашей службе приложений следующим образом:

_signInManager.AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = userDto.RememberMe }, identity);

После этого я перенаправляю пользователя на Home/Index.

В Home/Index параметр User.IsAuthenticated имеет значение true.

Но перед этим перенаправлением в AccountController даже после вызова _signInManager.AuthenticationManager.SignIn(...) User.IsAuthenticated имеет значение false.

Что мы делаем не так?

Проблема в том, что мне нужно провести модульное тестирование AccountController и проверить, действительно ли после вызова _signInManager.AuthenticationManager.SignIn(...) пользователь вошел в систему.

Огромное спасибо за помощь

Даниэль

ИЗМЕНИТЬ:

После использования этого кода:

            ClaimsPrincipal principal = new ClaimsPrincipal(identity);
            System.Threading.Thread.CurrentPrincipal = principal;
            HttpContext.Current.User = principal;

Работает хорошо, но пахнет странно!


person DAG    schedule 31.07.2015    source источник


Ответы (2)


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

person Sam FarajpourGhamari    schedule 31.07.2015
comment
Это было мое предположение. Но в AccountController по-прежнему нет перенаправления и мне нужно проверить, действительно ли пользователь аутентифицирован - person DAG; 31.07.2015
comment
Аутентификация на основе файлов cookie на основе запроса пользователя, и вы не можете выполнить модульное тестирование без получения нового запроса от клиента. - person Sam FarajpourGhamari; 31.07.2015
comment
Вы можете проверить, был ли отправлен заголовок ответа Set-cookie в потоке ответа. - person Sam FarajpourGhamari; 31.07.2015

Взгляните на эту ссылку: ASP.NET Identity AuthenticationManager vs. SignInManager и срок действия файлов cookie

Вы используете AuthenticationManager, я считаю, что ваш код выглядит примерно так:

private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);

    var identity = await UserManager.CreateIdentityAsync(
       user, DefaultAuthenticationTypes.ApplicationCookie);

    AuthenticationManager.SignIn(
       new AuthenticationProperties() { 
          IsPersistent = isPersistent 
       }, identity);
}

Вы можете использовать SignInManager. Его метод PasswordSignInAsync возвращает результат SingInStatus. В этом случае ваш код должен быть примерно таким:

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                return RedirectToLocal(returnUrl);
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
        }

Чтобы узнать, как его использовать, убедитесь, что у вас установлена ​​последняя версия Visual Studio 2013, и создайте новый проект веб-приложения asp.net, используя «Индивидуальные учетные записи пользователей» в качестве «Типа аутентификации».

person Fabio Luz    schedule 31.07.2015
comment
Это выглядит хорошо, я попробую. Мы не используем Async, хотя - person DAG; 31.07.2015