设置特定事件调用的会话

时间:2014-03-14 16:12:53

标签: asp.net-mvc session

我有一个MVC应用程序和一个名为AuthorisationFilter的自定义类,其.NET接口为IAuthorizationFilter,这有一个OnAuthorization方法,当我点击我的网站时会调用它,那时我开始验证用户的安全访问权限(可行),但我不想一直这样做,因为这很费时。

在此我尝试使用Session存储临时的登录信息(顺便提一下这是一个内部应用程序),但我不能像我一样工作期待。我不能只使用HttpContext,因此不断创建HttpContextBase的新实例,我假设它正在清除会话。我的代码如下:

    internal void SetSecurityLevel(int token)
    {
        HttpContextBase _cBase = new HttpContextWrapper(HttpContext.Current);
        _cBase.Session["SecurityRights"] = token;
    }

    internal int GetSecurityLevel()
    {
        HttpContextBase _cBase = new HttpContextWrapper(HttpContext.Current);
        if (_cBase.Session["SecurityRights"] == null)
        {
            SetSecurityLevel(-1);
        }
        return (int)_cBase.Session["SecurityRights"];
    }

请注意,这只是代码的一部分,SetSecurityLevel通过单独的方法调用设置为正确的值(未显示)

无论如何,我真正想要做的是在这个类中设置会话并保持它。我尝试了几种不同的方法,包括在初始化类时设置上下文,但我最终在GetSecurityLevel中的.Session对象上使用了NullReference

    private HttpContextBase _cBase = new HttpContextWrapper(HttpContext.Current);
    public AuthorisationFilter()
    {
        _cBase = new HttpContextWrapper(HttpContext.Current);

    }

我有没有办法在课堂上做到这一点?

1 个答案:

答案 0 :(得分:0)

你是对的,你不能在构造函数中设置,但是当上下文可用时你可以在OnActionExecuting

public override void OnActionExecuting(ActionExecutedContext filterContext)
{
     _session =  = filterContext.HttpContext.Session;

我想知道为什么你要在过滤器中设置这个安全级别,而不是直接从它需要的位置进行。