在默认的 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 5 中列出具有角色名称的用户