在ASP.NET Identity中,我有
var result = await _userManager.PasswordSignIn(model.Email, model.Password, model.RememberMe, true);
if(result == SignInStatus.Success)
{
if (myCondition)
{
_userManager.SignOut();
}
}
这里的SignOut不起作用。表示用户已登录。
因此,这是Katana中的一个错误,我相信它将在aspnet vNext更新中得到修复,基本问题是,当您在同一请求中同时调用SignIn和SignOut时,逻辑假设是最后一个获胜。我相信今天,它要么只是第一个,要么SignIn总是战胜SignOut。
该问题已在此处跟踪Katana codeplex问题
我假设您在Identity v2.1中使用SignInManager
,因为UserManager
上没有这样的方法。
当您调用SignInManaer.PasswordSignIn()
时,经过多次检查,如果一切都成功,则实际上并没有设置authcookie;它只为以后实际发送HTTP回复时设置回调。
调用SignOut()
时,AuthenticationManager
会检查以前是否授予了登录权限,但也会检查SignIn AuthenticationType
的类型是否与SignOut
的类型匹配。我猜您的登录使用了不同的身份验证类型来注销。
有太多可能的方式导致这不起作用。如果不着眼于整个解决方案,就很难推断出原因。
您可以在Katana Project中从Owin中查看AuthenticationManager
,亲眼看看到底出了什么问题——Identity实际上使用该组件在Owin中设置回调,以创建(或删除)auth cookie。
我只能考虑使用这个注销:
AuthenticationManager.SignOut(
DefaultAuthenticationTypes.ExternalCookie,
DefaultAuthenticationTypes.ApplicationCookie,
DefaultAuthenticationTypes.TwoFactorCookie,
DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie,
DefaultAuthenticationTypes.ExternalBearer);
注销所有内容。只是为了确定-)
UserManager是
private ApplicationUserManager userManager;
public ApplicationUserManager UserManager
{
get
{
return userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
userManager = value;
}
}
但是注销需要使用AuthenticationManager,它是
private IAuthenticationManager AuthenticationManager
{
get
{
return HttpContext.GetOwinContext().Authentication;
}
}
注销应为
AuthenticationManager.SignOut();
不是UserManger。
希望这能有所帮助。