Asp.net MVC何时在丢失时重新加载索赔

时间:2016-01-06 08:14:07

标签: asp.net asp.net-mvc claims-based-identity asp.net-identity-2

我在登录时添加了一些自定义声明。

private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
    var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
        var accesses = _roleAccessRepository.GetAssignedAccess(roleId);
        foreach (var access in accesses)
        {
           identity.AddClaim(new Claim("AccessCode", access));
        }
    AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
}

他们工作正常,直到我最近发现在经过一定的不活动后,我假设超过30分钟,这些说法都丢失了。但是,用户仍然登录。

如何在用户仍然登录时重新加载这些声明?

更新:如何发生。

我登录了一个用户,然后在大约30分钟后再次打开它,然后退出了它。它不会被注销,而是刷新了我的页面,没有声明。

1 个答案:

答案 0 :(得分:3)

您正面临着SecurityStampValidator的行动。在VS2013 / VS2015的标准MVC5模板中,有一个文件App_Start\Startup.Auth.cs包含以下行:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    Provider = new CookieAuthenticationProvider
    {
        // Enables the application to validate the security stamp when the user logs in.
        // This is a security feature which is used when you change a password or add an external login to your account.  
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
            validateInterval: TimeSpan.FromMinutes(30),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
    }
}); 

您需要查看SecurityStampValidator.OnValidateIdentity - 此方法每30分钟重新生成一次cookie(默认配置)。并且它不会保留在user.GenerateUserIdentityAsync(manager)之外添加的声明。

因此,您需要找到ApplicationUser类并修改GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)方法以包含您的声明。并且不要在其他任何地方添加声明。