ASP.NET Identity 注销另一个用户

Posted

技术标签:

【中文标题】ASP.NET Identity 注销另一个用户【英文标题】:ASP.NET Identity sign out another user 【发布时间】:2015-02-05 01:09:36 【问题描述】:

就像在这个question 中一样,我想通过更新安全标记来注销另一个用户。但是,在我的本地机器上测试时它不起作用。我怀疑问题可能出在我用来重置用户并将不同属性保存到数据库的命令顺序上。

那是我的Startup.Auth

public partial class Startup

    public static TimeSpan expireTimeSpan = TimeSpan.FromHours(24);
    public static IDataProtectionProvider DataProtectionProvider  get; private set; 

    public void ConfigureAuth(IAppBuilder app)
    
        app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>());

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            ExpireTimeSpan = expireTimeSpan,
            Provider = new CookieAuthenticationProvider
            
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                    validateInterval: TimeSpan.FromMinutes(30),
                    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
            
        );

        DataProtectionProvider = app.GetDataProtectionProvider();
    

这是一种控制器方法,允许更改其他用户的电子邮件 == 用户名。在更改电子邮件时,用户应该被注销并且不再有有效的密码。

public async Task<IHttpActionResult> UpdateUser(string id, ApplicationUser newUser)

    var user = await _userManager.FindByIdAsync(id);
    if (user == null) ...

    IdentityResult result;

    user.name = newUser.name;
    user.roles = newUser.roles;

    // sign out user and invalidate password
    if (user.email != newUser.email)
    
        user.email = newUser.email;
        user.PasswordHash = null;

        result = await _userManager.UpdateSecurityStampAsync(user.Id);
        if (!result.Succeeded) throw new Exception("Security Stamp not updated.");

        await _account.SendPasswordEmail(user);
    

    result = await _userManager.UpdateAsync(user);
    if (!result.Succeeded)
        return GetErrorResult(result);

    return Ok();

我尝试过先保留用户,然后生成一个新的SecurityStamp,但这也没有用。

有什么想法可能是错的吗?

谢谢!

【问题讨论】:

【参考方案1】:

显然您没有清楚地阅读您链接到的问题中的答案。

// important to register UserManager creation delegate. Won't work without it
app.CreatePerOwinContext(UserManager.Create);

这里进一步解释:

https://aspnetidentity.codeplex.com/workitem/2209

但是,您应该注意这个错误:

ExpireTimeSpan ignored after regenerateIdentity / validateInterval duration in MVC Identity (2.0.1)

这将在即将发布的 Identity 2.2/Owin 3.0 版本中修复,但尚未最终确定。

https://aspnetidentity.codeplex.com/workitem/2347

另请参阅此博客文章:

http://tech.trailmax.info/2014/08/cookieauthenticationprovider-and-user-session-invalidation-on-change-of-securitystamp/

【讨论】:

更新了 ConfigureAuth 以将 UserManager 的实例从我的 DI 容器传递到 OWIN 上下文,但仍然无法正常工作。我不认为我受到所描述的任何其他错误的影响。 但是我注意到这个回调 regenerateIdentity: (manager, user) =&gt; user.GenerateUserIdentityAsync(manager)) 在更新 SecurityStamp 时没有被调用 @BenjaminE。 - 您确定您的 DI 在调用时已连接吗?一般来说,您需要为几个可能的依赖项调用 CreatePerOwinContext,例如 ApplicationDbContext ......如果我是你,我会确保调用 GetService 实际返回实例。 @BenjaminE。 - 尝试在没有 DI 的情况下使用它,使用 UserManager.Create 函数,只是为了看看它是否有效,然后您已将问题缩小到您的 DI。 你说得对,UserManagerapp.CreatePerOwinContext 请求时没有解析。

以上是关于ASP.NET Identity 注销另一个用户的主要内容,如果未能解决你的问题,请参考以下文章

ASP.net Core Identity 从管理员以另一个用户身份登录 [重复]

如何在 cookie 上保留 ASP.NET 身份声明直到注销?

部署后 ASP.Net Core Identity 登录状态丢失

ASP.NET MVC 真正使用表单身份验证注销

将 JWT 自动加载到 User.Identity (ASP.NET Core 3.1)

ASP.NET Core Identity 系列之四