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;
工作正常,但闻起来怪怪的!
这是因为身份验证基于用户的浏览器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应用程序项目,使用"个人用户帐户"作为"身份验证类型"