我在ASP.NET Core 2.2框架的顶部有一个使用C#
编写的应用程序。
我正在使用Identity进行用户管理和用户控制。当前,每次用户关闭浏览器并再次打开应用程序时,都要求他们重新登录。
我想将登录名从会话更改为cookie,该cookie在闲置15分钟后就会过期。
这是我添加到Startup类中的内容
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<User()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddAuthentication()
.AddFacebook(facebookOptions =>
{
facebookOptions.AppId = Configuration["Authentication:Facebook:AppId"];
facebookOptions.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
});
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
// This code should be executed after the identity id registered to work
services.ConfigureApplicationCookie(config =>
{
config.SlidingExpiration = true;
config.ExpireTimeSpan = TimeSpan.FromMinutes(15);
config.Cookie.HttpOnly = true;
config.Events = new CookieAuthenticationEvents
{
OnRedirectToLogin = ctx =>
{
if (ctx.Request.Path.StartsWithSegments("/api", StringComparison.CurrentCultureIgnoreCase))
{
ctx.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
}
else
{
ctx.Response.Redirect(ctx.RedirectUri);
}
return Task.FromResult(0);
}
};
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
如您在上面看到的,我添加了以下内容
config.SlidingExpiration = true;
config.ExpireTimeSpan = TimeSpan.FromMinutes(15);
config.Cookie.HttpOnly = true;
我期望ExpireTimeSpan
代码将基于会话的登录名转换为基于Cookie的登录名。如果用户处于非活动状态,则还要在15分钟后等待Cookie。 SlidingExpiration
应在每个HTTP请求中更新Cookie的到期时间。
如何将基于会话的登录名转换为基于Cookie的登录名?
答案 0 :(得分:2)
深入研究 ASP.NET Core身份几个小时后,终于找到了适合您的解决方案。
转到您的Login
发布方法,并按如下所示编写_signInManager.PasswordSignInAsync
方法:
var result = await _signInManager.PasswordSignInAsync(Email, Password, isPersistent: true, lockoutOnFailure: true);
第三个参数是持久性Cookie。根据{{3}}
IsPersistent
标志,指示登录cookie在浏览器关闭后是否应保留。
转到您的ExternalLoginCallback
方法并按如下所示编写您的_signInManager.ExternalLoginSignInAsync
方法:
SignInResult signInResult = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: true);
我已经对它进行了测试,效果很好!