我有一个带有登录操作的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;
工作正常,但闻起来很怪异!
答案 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"身份验证类型"