Извинения и благодарности за этот вопрос! Я все еще новичок в 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.
Пока кажется, что я регистрирую пользователя через контроллер (Где находится Microsoft.AspNet.Identity.Owin.AuthenticationManager в версии RTM для Asp.Net?)... мой WindowsIdentity всегда пуст и не аутентифицирован после вызова SignIn. Объект user и ClaimIdentity правильно заполнен.
Вот метод действия, который я вызываю (переместил свойства в локальные переменные для полноты):
[HttpPost, AllowAnonymous, ValidateAntiForgeryToken]
public virtual async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid) {
var userManager = new UserManager<EtdsUser>(new UserStore<EtdsUser>(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 не назначен правильно?
Теперь аутентификация теперь определяется как:
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);
To:
var authOptions = new CookieAuthenticationOptions {
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
ExpireTimeSpan = TimeSpan.FromHours(4.0)
}; ...