具有IsAuthenticated的错误OWIN的MVC AccountController

时间:2015-07-31 11:47:21

标签: c# asp.net asp.net-mvc asp.net-mvc-5 owin

我有一个带有登录操作的AccountController。

我们在申请服务中签署用户:

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

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

在主页/索引中,User.IsAuthenticated为 true

但在进行此重定向之前,在AccountController中,即使在调用_signInManager.AuthenticationManager.SignIn(...)之后,User.IsAuthenticated也是 false

我们做错了什么?

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

非常感谢你的帮助

丹尼尔

修改

使用此代码后:

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

工作正常,但闻起来很怪异!

2 个答案:

答案 0 :(得分:2)

这是因为基于用户浏览器cookie的身份验证。您需要向客户端重定向推荐用户代理(浏览器)在新请求中发送cookie,然后您的应用可以进行身份​​验证。

答案 1 :(得分: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);
        }

要了解如何使用它,请确保您拥有最新版本的visual studio 2013并使用"个人用户帐户"创建一个新的asp.net Web应用程序项目。 as"身份验证类型"