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