在PasswordSignIn之后调用时,SignOut无法正常工作?

时间:2014-09-13 14:36:57

标签: asp.net asp.net-identity asp.net-identity-2

在我拥有的ASP.NET身份中,

var result = await _userManager.PasswordSignIn(model.Email, model.Password, model.RememberMe, true);
if(result == SignInStatus.Success)
{
    if (myCondition)
    {
        _userManager.SignOut();
    }
}

此处SignOut无效。表示用户已登录。

3 个答案:

答案 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;
            }
        }

但是注销需要使用

的AuthenticationManager
private IAuthenticationManager AuthenticationManager
    {
        get
        {
            return HttpContext.GetOwinContext().Authentication;
        }
    }

退出应

AuthenticationManager.SignOut();

Not UserManger。

希望这有帮助。