MVC AccountController with IsAuthenticated false OWIN

本文关键字:false OWIN IsAuthenticated with AccountController MVC | 更新日期: 2023-09-27 18:05:55

我有一个带有Login动作的AccountController。

我们像这样在应用程序服务中登录用户:

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

之后我将用户重定向到Home/Index。

在主页/索引用户。IsAuthenticated是true

但是在做这个重定向之前,在AccountController中,甚至在调用_signInManager.AuthenticationManager.SignIn(…)之后用户。IsAuthenticated is false.

我们做错了什么?

问题是,我需要对AccountController进行单元测试,并希望在调用_signInManager.AuthenticationManager.SignIn(…)后测试用户是否真正登录。

非常感谢您的帮助

丹尼尔

编辑:

使用此代码后:

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

工作正常,但闻起来怪怪的!

MVC AccountController with IsAuthenticated false OWIN

这是因为身份验证基于用户的浏览器cookie。你需要一个重定向推荐到客户端到用户代理(浏览器)发送新的请求中的cookie,然后你的应用程序可以认证。

看看这个链接: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 web应用程序项目,使用"个人用户帐户"作为"身份验证类型"