C# 如何在ASP.NET MVC上获得会话持久性?

C# 如何在ASP.NET MVC上获得会话持久性?,c#,asp.net,.net,asp.net-mvc,asp.net-identity,C#,Asp.net,.net,Asp.net Mvc,Asp.net Identity,我有一个使用ASP.NET标识的ASP.NET MVC 5.0项目。当用户登录时,我使用此功能按系统跟踪用户 SignInManager.SignIn(user,IsPersistent,false) 在用户配置文件中,我可以更改用户名,之后我需要自动重新登录用户以保持用户跟踪。我注销用户并使用此功能登录,但在哪里可以获得当前会话的IsPersistent属性 我可以在每次登录后将ispersist存储在数据库的用户表中,但我认为这不是最好的解决方案 我已更改AccountController

我有一个使用ASP.NET标识的ASP.NET MVC 5.0项目。当用户登录时,我使用此功能按系统跟踪用户

SignInManager.SignIn(user,IsPersistent,false)
在用户配置文件中,我可以更改
用户名
,之后我需要自动重新登录用户以保持用户跟踪。我注销用户并使用此功能登录,但在哪里可以获得当前会话的
IsPersistent
属性


我可以在每次登录后将ispersist存储在数据库的用户表中,但我认为这不是最好的解决方案

我已更改AccountController登录操作中的登录代码以满足您的要求。我已经注释掉了ASP.NET身份默认登录机制

现在,这段代码将首先找到用户,然后检查输入的密码是否与用户的密码匹配。一旦密码匹配,它将向用户添加一个假声明来存储持久状态并登录用户

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    SignInStatus result = SignInStatus.Failure;

    var user = UserManager.FindByEmail(model.Email);
    if (user != null)
    {
        var isPasswordOk = UserManager.CheckPassword(user, model.Password);
        if (isPasswordOk)
        {
            user.Claims.Add(new IdentityUserClaim() { ClaimType = "IsPersistent", ClaimValue = model.RememberMe.ToString() });
            await SignInManager.SignInAsync(user, model.RememberMe, false);

            result = SignInStatus.Success;
        }
    }

    // This doesn't count login failures towards account lockout
    // To enable password failures to trigger account lockout, change to shouldLockout: true
    //var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);

    switch (result)
    {
        case SignInStatus.Success:
            return RedirectToLocal(returnUrl);

        case SignInStatus.LockedOut:
            return View("Lockout");

        case SignInStatus.RequiresVerification:
            return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });

        case SignInStatus.Failure:
        default:
            ModelState.AddModelError("", "Invalid login attempt.");
            return View(model);
    }
}

我希望这能解决您的问题。

要获取
IsPersistent
的值,请调用
authenticateSync

@using Microsoft.AspNet.Identity;

var authenticateResult = await HttpContext.GetOwinContext()
                               .Authentication.AuthenticateAsync(
                                   DefaultAuthenticationTypes.ApplicationCookie
                               );
var isPersistent = authenticateResult.Properties.IsPersistent; //// true or false

为什么不将IsPersistent存储在会话中,并在重新记录用户时从会话中获取值。@AjmalAmirzad good idia。如果我在会话中登录,我可以将seision变量设置为所选值,但如果有autologin,我需要检查它并将sessiön值isPersistant=true。如果您愿意,可以将其作为答案传递。我已经解决了问题,并在下面发布了解决方案。但是如果此信息在索赔中,它将如何在不同的分区上工作。如果我在一台计算机上进行永久登录,而在另一台计算机上进行临时登录?@DmitrijPolyanin我无法理解你的问题。不同设备/浏览器上的每次登录都会生成一个单独的会话,因此使用永久登录登录到一个设备/浏览器将保持登录的永久性,使用临时登录登录到不同设备将在您关闭浏览器时终止会话。我不是在争论,但为了理解,我将其存储在声明中,而不是会话中,因为我希望它在整个登录期间都可用。
@using Microsoft.AspNet.Identity;

var authenticateResult = await HttpContext.GetOwinContext()
                               .Authentication.AuthenticateAsync(
                                   DefaultAuthenticationTypes.ApplicationCookie
                               );
var isPersistent = authenticateResult.Properties.IsPersistent; //// true or false