C# 在默认的ASP.NETMVC模板中,为什么用户每次更改某些内容时都会重新登录?

C# 在默认的ASP.NETMVC模板中,为什么用户每次更改某些内容时都会重新登录?,c#,project-template,asp.net-mvc-5.2,C#,Project Template,Asp.net Mvc 5.2,因此,我使用默认的ASP.NETMVC模板,并从项目中整理出我不需要的东西。如果用户更改密码或电话号码等内容,则会继续重新登录 例如,在ManagerController.cs文件中,我一直看到如下内容 // // POST: /Manage/ChangePassword [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> ChangePassword(Ch

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

例如,在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);
    }
//
//POST:/管理/更改密码
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务ChangePassword(ChangePasswordViewModel模型)
{
如果(!ModelState.IsValid)
{
返回视图(模型);
}
var result=await UserManager.ChangePasswordAsync(User.Identity.GetUserId(),model.OldPassword,model.NewPassword);
if(result.successed)
{
var user=await UserManager.FindByIdAsync(user.Identity.GetUserId());
如果(用户!=null)
{
等待SignInManager.SignInAsync(用户,isPersistent:false,rememberBrowser:false);
}
返回RedirectToAction(“Index”,new{Message=ManageMessageId.ChangePasswordSuccess});
}
加法器(结果);
返回视图(模型);
}
该守则的有关部分如下:

            var user = await UserManager.FindByIdAsync(User.Identity.GetUserId<int>());
            if (user != null)
            {
                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
            }
var user=await UserManager.FindByIdAsync(user.Identity.GetUserId());
如果(用户!=null)
{
等待SignInManager.SignInAsync(用户,isPersistent:false,rememberBrowser:false);
}
这个重复代码的目的是什么?我需要它吗?顺便说一下,我删除了两个因素授权和电话验证

我需要它吗

是(见下文)

这个重复代码的目的是什么


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

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

还有其他方法可以重新生成安全戳,这实际上是所需的全部,因为带有无效安全戳的身份验证cookie将被重新生成以包含正确的信息,而不是拒绝未经授权的请求。但是,这是默认情况下执行的方法,可能是所需的全部