更新:
这绝对不是RC1中的错误。 cookie设置正在使用默认的UserManager和UserStore,因此它必须是与我的UserManager / UserStore相关的东西,我已经监督。我基本上使用这里的实现: https://github.com/jesblit/ASPNET5-FormAuthenticationLDAP
原帖:
我遇到持久登录问题。无论我如何配置cookie,30分钟后,用户都会自动注销(无论用户与应用程序进行多少交互)。
我设置了我的应用程序:
public void ConfigureServices(IServiceCollection services)
{
services.AddCaching();
services.AddSession(options => {
options.IdleTimeout = TimeSpan.FromDays(1);
options.CookieName = ".MySessionCookieName";
});
services.AddEntityFramework()
.AddNpgsql()
.AddDbContext<Model1>(options =>
options.UseNpgsql(Configuration["Data:DefaultConnection:ConnectionString"]));
services.AddIdentity<MinervaUser, MinervaRole>(options => {
options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromDays(1);
options.Cookies.ApplicationCookie.SlidingExpiration = true;
options.Cookies.ApplicationCookie.AutomaticAuthenticate = true;
})
.AddUserStore<MinervaUserStore<MinervaUser>>()
.AddRoleStore<MinervaRoleStore<MinervaRole>>()
.AddUserManager<MinervaUserManager>();
services.AddMvc();
}
和
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
try
{
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
.CreateScope())
{
}
}
catch { }
}
app.UseIISPlatformHandler(options => { options.AuthenticationDescriptions.Clear(); options.AutomaticAuthentication = true; });
app.UseSession();
app.UseIdentity();
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
登录操作是:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
_logger.LogInformation(1, "User logged in.");
return RedirectToLocal(returnUrl);
}
...
我使用默认的SignInManager。如上所述,我在Startup.Configure和Startup.ConfigureServices中设置的Expiration Timeouts根本没有任何效果。登录 - &gt; 30分钟 - &gt;自动退出:(
如何延长这段时间?
(顺便说一句:自定义用户,UserManager,UserStore不会以任何方式干扰Cookie,他们只是&#34;验证凭据(他们应该做什么;)) )
答案 0 :(得分:1)
TL; DR:如果您有自定义用户管理器,请务必实施GetSecurityStampAsync,UpdateSecurityStampAsync并将SupportsUserSecurityStamp设置为true。
对此的解决方案非常简单(但我还没有在文档的任何地方找到它)。由于默认实现(创建新的ASP MVC6 App ...)有效,我检查了他们的数据库表并找到了安全标记(我没有实现)。根据对这个问题的回答What is ASP.NET Identity's IUserSecurityStampStore<TUser> interface?,这个邮票每30分钟重新验证一次,这非常适合我的问题。所以,我所做的就是用
扩展我自己的UserManagerpublic class MinervaUserManager:UserManager<MinervaUser>
// Minerva being the name of the project
{
...
public override bool SupportsUserSecurityStamp
{
get
{
return true;
}
}
public override async Task<string> GetSecurityStampAsync(MinervaUser user)
{
// Todo: Implement something useful here!
return "Token";
}
public override async Task<IdentityResult> UpdateSecurityStampAsync(MinervaUser user)
{
// Todo: Implement something useful here!
return IdentityResult.Success;
}
这些假人总是返回相同的SecurityStamp和&#34;成功&#34;在每个更新。这是安全的,因为没有任何位的SecurityStamps阻止注销。