在默认的 ASP.Net MVC 模板中,为啥用户每次更改时都会重新登录?

Posted

技术标签:

【中文标题】在默认的 ASP.Net MVC 模板中,为啥用户每次更改时都会重新登录?【英文标题】:In the default ASP.Net MVC template, why does the user get re-signed in every time they change something?在默认的 ASP.Net MVC 模板中,为什么用户每次更改时都会重新登录? 【发布时间】:2015-05-07 04:54:15 【问题描述】:

所以我使用默认的 ASP.Net MVC 模板并从项目中整理出我不需要的东西。如果用户更改密码或电话号码等内容,用户会继续重新登录。

例如,在 ManagerController.cs 文件中,我不断看到类似

    //
    // POST: /Manage/ChangePassword
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> ChangePassword(ChangePasswordViewModel model)
    
        if (!ModelState.IsValid)
        
            return View(model);
        
        var result = await UserManager.ChangePasswordAsync(User.Identity.GetUserId<int>(), model.OldPassword, model.NewPassword);
        if (result.Succeeded)
        
            var user = await UserManager.FindByIdAsync(User.Identity.GetUserId<int>());
            if (user != null)
            
                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
            
            return RedirectToAction("Index", new  Message = ManageMessageId.ChangePasswordSuccess );
        
        AddErrors(result);
        return View(model);
    

该代码的相关部分是

            var user = await UserManager.FindByIdAsync(User.Identity.GetUserId<int>());
            if (user != null)
            
                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
            

这段重复代码的目的是什么?我需要吗?顺便说一句,我正在删除 2 因素授权和电话验证。

【问题讨论】:

【参考方案1】:

使用 SignInManager.SignIn 再次登录用户应该会导致重新生成用户身份验证 cookie(如果使用默认的应用程序 cookie)并重新生成用户的安全标记。每当用户角色、声明、登录或存储在 ClaimsIdentity (User.Identity) 中的任何其他内容发生更改时,都应更改安全标记。否则,用户将使用与数据库不匹配的过时 cookie(这是一个序列化的 ClaimsIdentity)。如果发生这种情况,他们的角色可能已被删除,也可能没有被添加的角色。

还有其他方法可以重新生成安全标记,这实际上是所有需要的,因为具有无效安全标记的身份验证 cookie 将简单地重新生成以包含正确的信息,而不是拒绝未经授权的请求。但是,这是默认的完成方式,可能就是所有需要的。

【讨论】:

【参考方案2】:

我需要吗?

是的(见下文)

这段重复代码的目的是什么?

假设您使用的是 Identity,那么通常需要重新加载所有声明。我不确定是否有任何声明有任何密码哈希或种子(如果有的话,那么肯定),但是任何角色更改或声明更改对于以后的代码(也许在一个视图中)正确验证用户是必要的。

【讨论】:

以上是关于在默认的 ASP.Net MVC 模板中,为啥用户每次更改时都会重新登录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core 5 MVC (.NET 5) 中获取记录的用户数据?

ASP.NET MVC 4 默认 _LoginPartial 模板注销不起作用

在标准 ASP.NET MVC 安装模板中模拟用户

如何在 ASP.NET MVC 5 中列出具有角色名称的用户

ASP.NET MVC 和 ASP.NET 成员资格模板提供程序

ASP.NET MVC 5 默认模板的JS和CSS 是怎么加载的?