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

时间:2017-07-03 10:46:29

标签: asp.net-mvc session asp.net-core asp.net-core-mvc

我有一个asp.net核心项目。应用程序中存在两个角色。可以在站点中执行的具有受限访问权限的用户角色,以及可以在站点和管理面板中执行的具有完全访问权限的管理角色 出于某些安全原因,我希望管理员闲置超时(约30分钟),用户角色超时1天。 对于用户角色作为默认值我设置此代码

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

如何配置管理员角色IdleTimeout?

2 个答案:

答案 0 :(得分:1)

简单地说,你不能。会话超时是全局的。但是,您可以在其上实现一个手动超时会话的图层。例如,当会话启动时,您可以添加具有当前日期和时间的会话变量。然后,您可以添加一个全局操作筛选器来检查此会话var,并将datetime与特定用户角色的自定义超时进行比较。如果已超出自定义超时,则可以手动销毁会话(Session.Abandon())。为了使其正常工作,您的全局会话超时必须是可能的最长超时(可能是对于管理员),然后您的自定义超时将适用于具有较短超时时间的任何角色。

答案 1 :(得分:0)

我想应修改SessionMiddleware以设置不同会话的空闲时间。

说明:

AddSession在DI中将SessionOptions对象注册为单身。该对象被注入SessionMiddleware。不幸的是,它被注入一个构造函数中。正如我们know,在app启动时构建了一个中间件。每次请求依赖项注入仅适用于Invoke方法,而SessionMiddleware不允许Invoke方法接受SessionOptions

所以计划是:

  1. 分叉SessionMiddleware并实施Invoke(HttpContext, SessionOptions)方法。
  2. AddSession来电后,replace SessionOptions注册。
  3. 例如:

    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));