在PasswordSignIn之后调用时,SignOut不起作用



在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。

希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新