如何在asp.net core项目中为特定用户设置不同的空闲超时时间

3

我有一个asp.net core项目。应用程序中存在两个角色,用户角色具有受限访问权限,可以在网站上执行操作,管理员角色具有完全访问权限,可以在网站和管理员面板上执行操作。 出于某些安全原因,我希望管理员的空闲超时时间较短(约为30分钟),而用户角色的超时时间为1天。 对于用户角色,默认情况下,我设置了以下代码:

services.AddSession(options =>
    {
        options.IdleTimeout = TimeSpan.FromDays(1);
        options.CookieName = "Session";
    });

如何配置管理员角色的IdleTimeout?

2个回答

1
我猜想SessionMiddleware应该被修改,以设置不同的会话空闲时间。
解释: AddSession将一个SessionOptions对象注册为DI中的单例。该对象被注入到SessionMiddleware中。不幸的是,它被注入到了一个构造函数中。正如我们所知道的那样,中间件在应用程序启动时被构建。每个请求的依赖注入只可能在Invoke方法中进行,并且SessionMiddleware没有接受SessionOptionsInvoke方法。
因此,计划是:
  1. 派生 SessionMiddleware 并实现 Invoke(HttpContext, SessionOptions) 方法。
  2. AddSession 调用之后,替换 SessionOptions 注册。

例如:

services.Replace(new ServiceDescriptor(typeof(SessionOptions),
    provider =>
    {
        //you could resolve another dependencies here and determine user's role.
        var service = provider.GetService<FooService>();

        return new SessionOptions();
    },
    ServiceLifetime.Scoped));

1
简而言之,你无法单独更改会话超时时间。然而,你可以在此基础上实现一个手动超时会话的层。例如,在会话开始时,你可以添加一个包含当前日期和时间的会话变量。然后,你可以添加一个全局操作过滤器来检查此会话变量,并将日期时间与特定用户角色的自定义超时时间进行比较。如果已超出自定义超时时间,则可以手动销毁会话(Session.Abandon())。为了使此方法生效,你的全局会话超时时间必须是可能的最长超时时间(可能适用于管理员),然后你的自定义超时时间将适用于任何具有较短超时时间的角色。

我对这个解决方案非常感兴趣。你能提供一个例子吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接