gpt4 book ai didi

c# - Asp.Net Core 2 MVC 身份验证 : Add different session times

转载 作者:行者123 更新时间:2023-11-30 18:12:53 32 4
gpt4 key购买 nike

我是一般编码的新手,特别是 Asp.Net Core,所以请原谅我的笨拙。我真的希望对我的项目有所帮助。我现在在登录时为不同的用户添加不同的 TimeSpan 来撕扯我的头发。例如说来自 company 1 的用户登录并且希望获得 session 时间为 60 分钟(即空闲时间),但当来自 公司 2 的用户登录时, session 时间可能是默认的 20 分钟。

更新:我的目标框架.Net Framework 4.6.1,但代码是为.Net Core 2.1准备的,我正在运行身份包v2.1.2

我的 startup 类如下所示:

public class Startup
{
public Startup(IHostingEnvironment env)
{
CultureInfo.CurrentCulture = new CultureInfo("sv-SE");
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

if (env.IsDevelopment())
{
builder.AddUserSecrets<Startup>();
}

builder.AddInMemoryCollection(GetBeanstalkEnvironmentProperties());
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}

public IConfigurationRoot Configuration { get; }

public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfiguration>(Configuration);

// Add framework services.
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("ExternalServerConnection")));

services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();

services.Configure<EmailConfiguration>(Configuration.GetSection("EmailConfiguration"));
services.AddMvc();

// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
}

登录 Controller 就这么简单:

  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 RedirectToAction("...");
...

在检查了不同的解决方案和论坛后发现 thisStartup 中添加 Timespan 的选项:

        services.Configure<SecurityStampValidatorOptions>(options =>
{
// Add validationinterval E.g how often the stamp is checked.
options.ValidationInterval = TimeSpan.FromSeconds(10);
});
services.AddAuthentication().Services.ConfigureApplicationCookie(options =>
{
// Timespan extension if page is refreshed or navigated. Default is true.
options.SlidingExpiration = true;
// Cookie is valid at minimum 20 min.
options.ExpireTimeSpan = TimeSpan.FromMinutes(20);
});

这工作正常,但这是为用户设置 session 时间的全局方式,然后将应用于所有用户。所以我希望有人有一个很好的解决方案,我可以使用上面的内容,并且仍然能够在这里添加不同的值 options.ExpireTimeSpan = TimeSpan.FromMinutes(20); 取决于用户的偏好,例如用户是哪家公司的成员。

其他引用资料和我到目前为止尝试过的内容。

我试着计算 this一个出来,但在我的情况下没有成功。我想我首先需要能够检查用户的声明(以查看用户属于哪个公司)并且可能为特定公司设置一个值,例如company 1 DB 表 中的值 60 然后读取该值并使用 Db 中的值或更“丑陋”的值更新 Timespan方法只是硬编码 Startup 中的值。假设用户属于某个公司,那么它应该有一个特定的 session 值,或者如果没有设置默认值 20 分钟。例如在伪中:(如果 user.companyID 等于 1,则设置 options.ExpireTimeSpan = TimeSpan.FromMinutes(60))等等。我的问题是,我当然不能在启动时访问这些值,也许不应该?

我也试过 this但是如果我没有弄错并且不影响空闲用户时间,那会为客户端扩展 cookie?!它还使用 Session,我想我可以添加它,但我不确定这对我的情况有什么好处。

我试着关注 this文档也尽可能多。但是该框架似乎不支持多个/不同的 ExpireTimeSpan 设置。

Here是另一个问题,目前还没有答案,我可以说出与我遇到的问题相同的问题。

最佳答案

我是这样解决的:

    services.Configure<SecurityStampValidatorOptions>(Configuration.GetSection("SecurityStampValidatorOptions"));

services.AddAuthentication().Services.ConfigureApplicationCookie(options =>
{
var cookieAuthenticationOptions = Configuration
.GetSection(nameof(CookieAuthenticationOptions))
.Get<CookieAuthenticationOptions>();
if (cookieAuthenticationOptions == null)
return;

options.ExpireTimeSpan = cookieAuthenticationOptions.ExpireTimeSpan;
options.SlidingExpiration = cookieAuthenticationOptions.SlidingExpiration;
});

也许不是最好的方法,但我仍然可以使用 Services.ConfigureApplicationCookie 选项,并且能够覆盖 SecurityStampValidatorOptionsCookieAuthenticationOptions 的一部分设置(appsettings.json、ENV 等),这样我就可以使用不同的设置部署应用程序。

我找不到如何直接配置应用程序 cookie来自配置部分,因此设置了选定的几个属性如果设置可用。

所以它没有解决我的真正问题,但这已经足够了,因为我有不同的部署选项和位置,所以这是一个可行的解决方案。

然后我可以在 appsettings.json 中做这样的例子:

"SecurityStampValidatorOptions": {
"ValidationInterval": "0.00:00:20"
},
"CookieAuthenticationOptions": {
"SlidingExpiration": true,
"ExpireTimeSpan": "0.02:00:00"
}

并覆盖默认值,并且在前期是 Startup 中没有硬编码值。

关于c# - Asp.Net Core 2 MVC 身份验证 : Add different session times,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54787281/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com