Как вы входите в систему / аутентифицируете пользователя с битами Asp.Net MVC5 RTM с использованием AspNet.Identity?

Извиняйтесь и заблаговременно за этот вопрос! Я все еще новичок в SO.

Я работаю над веб-приложением, используя MVC5, EF6 и VS 2013.

Я потратил некоторое время на обновление бит RC после его выпуска. Благодаря всем замечательным сообщениям: например. Развязка Microsoft.AspNet.Identity. * И обновление asp.net MVC с 5.0.0-beta2 до 5.0.0-rc1 !

В своей бесконечной мудрости я решил перейти к биткам RTM, которые @Hao Kung опубликовали здесь: Как я могу получить ранний доступ к предстоящим изменениям Asp.Net Identity? , Я решил, что избавлю от неприятностей и не буду слишком отставать, когда мы наконец получим сборку RTM.

Это было либо кошмаром, либо я просто полностью упустил что-то (или и то и другое), поскольку не могу понять основные задачи, которые работали с материалом RC1.

Хотя кажется, что я регистрирую пользователя через controller ( где находится Microsoft.AspNet.Identity.Owin.AuthenticationManager в версии RTM для аутентификации Asp.Net? ) … моя WindowsIdentity всегда пуста и не аутентифицирована после вызова SignIn. Объект user и ClaimIdentity правильно заполнен.

Вот метод действия, который я вызываю (для полноты переброшенных свойств для локальных переменных):

[HttpPost, AllowAnonymous, ValidateAntiForgeryToken] public virtual async Task Login(LoginViewModel model, string returnUrl) { if (ModelState.IsValid) { var userManager = new UserManager(new UserStore(new EtdsContext())); var user = userManager.Find(model.UserName, model.Password); if (user != null) { var authenticationManager = HttpContext.GetOwinContext().Authentication; authenticationManager.SignOut(new[] {DefaultAuthenticationTypes.ApplicationCookie, DefaultAuthenticationTypes.ExternalCookie, DefaultAuthenticationTypes.ExternalBearer}); var claimsIdentity = await userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); authenticationManager.SignIn(new AuthenticationProperties { IsPersistent = model.RememberMe}, claimsIdentity); return RedirectToLocal(returnUrl); } } ModelState.AddModelError("", "The user name or password provided is incorrect."); return View(model); } 

(На стороне примечание: в настоящее время мне не нужно регистрировать внешних пользователей.)

Какие-либо предложения? -или- Должен ли я откатывать все мои изменения и ждать, пока VS 2013 будет RTMd?


Обновите, отредактируйте код, чтобы он приблизился к исходному ответу @Hao Kung. Тем не менее, я до сих пор не получаю действительную идентификацию пользователя. Я думаю, что мой AuthenticationManager не назначен правильно?

AuthenticationManger теперь определяется как:

 public IAuthenticationManager AuthenticationManager { get { return HttpContext.GetOwinContext().Authentication; } } 

SignInAsync теперь является отдельным методом:

 private async Task SignInAsync(EtdsUser user, bool isPersistent) { AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); var claimsIdentity = await _userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent}, claimsIdentity); } 

После «SignOut» отладчик показывает:

 AuthenticationManager.User.Identity {System.Security.Principal.WindowsIdentity} [System.Security.Principal.WindowsIdentity]: {System.Security.Principal.WindowsIdentity} AuthenticationType: "" IsAuthenticated: false Name: "" 

«ClaimIdentity»:

 claimsIdentity {System.Security.Claims.ClaimsIdentity} Actor: null AuthenticationType: "ApplicationCookie" BootstrapContext: null Claims: {System.Security.Claims.ClaimsIdentity.get_Claims} IsAuthenticated: true Label: null Name: "alon" NameClaimType: "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" RoleClaimType: "http://schemas.microsoft.com/ws/2008/06/identity/claims/role" 

«SignIn» ничего не меняет:

 AuthenticationManager.User.Identity {System.Security.Principal.WindowsIdentity} [System.Security.Principal.WindowsIdentity]: {System.Security.Principal.WindowsIdentity} AuthenticationType: "" IsAuthenticated: false Name: "" 

Тем не менее, нет аутентификации, но, похоже, не возникает ошибок.


Как ответил @Hao Kung, сменил StartUp.Auth.cs с:

 var authOptions = new CookieAuthenticationOptions { ExpireTimeSpan = TimeSpan.FromHours(4.0)}; app.UseCookieAuthentication(authOptions); 

Для того, чтобы:

 var authOptions = new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login"), ExpireTimeSpan = TimeSpan.FromHours(4.0) }; ... 

Итак, вот как будет выглядеть логин в RTM (код, скопированный из кода примера ASPNET Identity ):

  // // POST: /Account/Login [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task Login(LoginViewModel model, string returnUrl) { if (ModelState.IsValid) { var user = await UserManager.FindAsync(model.UserName, model.Password); if (user != null) { await SignInAsync(user, model.RememberMe); return RedirectToLocal(returnUrl); } else { ModelState.AddModelError("", "Invalid username or password."); } } // If we got this far, something failed, redisplay form return View(model); } 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); } 

EDIT: И вам нужны следующие изменения в Startup.Auth.cs:

  app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login") }); 
  • Разрешить загрузку JSON-файлов в Visual Studio Express 2013 для Интернета
  • Разработка приложений .NET Compact Framework в Post-2008 Visual Studio?
  • Процесс с идентификатором #### не запущен в обновлении профессиональной версии 2013 студии 3
  • Создание Qt5 с Visual Studio 2012 / Visual Studio 2013 и интеграция с IDE
  • Ошибка выбора EditorOptionDefinition Export
  • Вызовите asynchronous метод в конструкторе?
  • Visual Studio 2013 - Нет установленных веб-шаблонов Visual Basic / Visual C #
  • Не удалось загрузить файл или сборку «System.Web.Http 4.0.0 после обновления с 2012 по 2013 год»
  • Как отключить CodeLens-Ссылки
  • Новый проект Asp.Net MVC5 создает бесконечный цикл для входа в систему
  • Двойное удаление в файле initializer_list vs 2013
  • Давайте будем гением компьютера.