繁体   English   中英

如何从ASP.NET MVC项目中的自定义数据注释访问Session?

[英]How to access Session from a custom data annotation in an ASP.NET MVC project?

出于某些实验性/运动性目的,我在尝试进行身份服务之前尝试实现原始登录系统。

我的想法是创建一个自定义数据注释(就像Identity的[Authorize]一样),并传递Session []携带的输入表单数据。 因此,我将使用自定义注释来授权某些控制器或方法。

public class IdCheck: ValidationAttribute
    {
        public string currentId { get; set; }

        public override bool IsValid(object value)
        {
            currentId = value as string;
            if (currentId != null)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

我试图这样使用它:

[IdCheck(currentId = Session["UserId"])]
public class SomeController : Controller
{
//methods
}

但是,消息出现错误:“非静态字段,方法或属性'Controller.Session'需要对象引用”

我既不能在控制器之前也不能在方法声明之前访问Session []。 我不知道如何实例化或引用。

在我的情况下,有没有办法利用Session []? 因为我不想用if语句手动检查每个方法

if(Session["UserId"] != null) {}

任何替代解决方案都受到欢迎。

注意:我知道不建议使用Session实现此类任务。 但是我的目的是在使用高级身份服务之前了解登录操作的工作方式。

在我的情况下,有没有办法利用Session []?

并非您现在正在做的那样,但是您可以在自定义属性代码中使用HttpContext.Current.Session而不是将其作为属性传递。

非常感谢奥斯卡。 您提出的建议确实有效。 但是,我设法找到了一种更好的方式,可以使用自定义数据注释执行我的“原始登录”操作。

经过更多研究后,发现将FilterAttribute类与IAuthorizationFilter过滤器一起实现就可以了。 我相信这也可以帮助其他人:

public class IdCheck : FilterAttribute, IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext.HttpContext.Session["UserId"] == null)
            {
                filterContext.Result = new RedirectResult("/");
            }
        }
    }

和用法当然是相同的:

[IdCheck]
public class SomeController : Controller
{
//methods
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM