2015-07-31 2 views
2

У меня есть AccountController с действием входа.MVC AccountController с IsAuthenticated false OWIN

Мы зарегистрировались пользователю в нашей службы приложений, как, что:

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

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

В Home/проиндексирует User.IsAuthenticated является истинным

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

Что мы делаем неправильно?

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

Большое спасибо за помочь

Daniel

EDIT:

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

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

Хорошо работает, но запахи странные!

ответ

2

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

+0

Это было мое предположение. Но в AccountController все еще нет перенаправления, и мне нужно проверить, действительно ли пользователь аутентифицирован. – DAG

+0

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

+0

Вы можете проверить, был ли отправлен ответ заголовка Set-cookie в потоке ответов. –

1

Посмотрите на эту ссылку: ASP.NET Identity AuthenticationManager vs. SignInManager and cookie expiration

Вы используете 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); 
     } 

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

+0

Это выглядит хорошо, я попробую. Мы не используем Async, хотя – DAG

+0

Это то, что я пытаюсь, и это не работает. – sovemp

Смежные вопросы