c# - 如何在浏览器关闭 15 分钟后使用 Core 2.2 中的 Identity 保持会话活动?
问题描述
C#
我有一个基于 ASP.NET Core 2.2 框架编写的应用程序。
我正在使用身份进行用户管理和用户控制。目前,用户每次关闭浏览器并再次打开应用程序时,都需要重新登录。
我想将登录从会话更改为在 15 分钟不活动后过期的 cookie。
这是我添加到 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。应该更新每个 HTTP 请求的SlidingExpiration
cookie 过期时间。
如何将基于会话的登录转换为基于 cookie 的登录?
解决方案
在深入研究ASP.NET Core 身份数小时后,我终于找到了适合您的解决方案。
转到您的post 方法并按如下Login
方式编写您的方法:_signInManager.PasswordSignInAsync
var result = await _signInManager.PasswordSignInAsync(Email, Password, isPersistent: true, lockoutOnFailure: true);
这是第三个参数,用于持久 Cookie。根据微软文档
IsPersistent
指示登录 cookie 是否应在浏览器关闭后保留的标志。
对于外部登录:
转到您的ExternalLoginCallback
方法并编写_signInManager.ExternalLoginSignInAsync
方法如下:
SignInResult signInResult = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: true);
我已经在我身边测试过它,它工作得很好!
推荐阅读
- amazon-web-services - 无法 scp 到 EC2 实例,但可以 SSH
- react-native - 我无法在 react native cli 项目中安装新版本(3.0.7)的 native-base
- php - 函数存储未保存在数据库 laravel 8 中
- javascript - 捕获块不会被解雇
- reactjs - “IntrinsicAttributes”类型上不存在属性“商店”
- oracle - 复制活动需要更多时间才能将数据从本地 Oracle 数据库复制到 Azure Synapse Analytics
- html - 如何对图像产生这种效果
- mysql - 为什么这个 Javascript 函数会重写一个 div 的 innerHTML 而不是另一个?
- sql - 窗口函数可以与分组集一起使用吗?
- tkinter - tkinter labelframe 类继承问题