Подтвердить что ты не робот

Как вы входите в систему/аутентифицируете пользователя с битами 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.

Пока кажется, что я регистрирую пользователя через контроллер (Где находится 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)
}; ...
4b9b3361

Ответ 1

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

    //
    // POST: /Account/Login
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> 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);
    }

РЕДАКТИРОВАТЬ: И вам нужны следующие изменения в вашем Startup.Auth.cs:

        app.UseCookieAuthentication(new CookieAuthenticationOptions {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login")
        });