如何从 ASP.NET MVC 项目中的自定义数据注释访问 Session?
How to access Session from a custom data annotation in an ASP.NET MVC project?
出于某些 experimental/exercise 目的,我试图在继续使用身份服务之前实现一个原始登录系统。
我的想法是创建自定义数据注释 - 就像身份的 [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
}
但是,我收到一条错误消息:"An object reference is required for the non static field, method or property 'Controller.Session'"
我既不能访问控制器之前的 Session[],也不能访问方法声明之前的 Session[]。我不知道如何实例化或引用。
有没有办法在我的案例中使用 Session[]?因为我不想用
这样的 if 语句手动检查每个方法
if(Session["UserId"] != null) {}
我们非常欢迎任何替代解决方案。
注意:我知道使用 Session 不是实现此类任务的推荐方法。但我的目的是在使用高级身份服务之前了解登录操作的工作原理。
有没有办法在我的案例中使用 Session[]?
不像您现在所做的那样,但您可以在自定义属性代码中使用 HttpContext.Current.Session 而不是将其作为 属性 传递。
非常感谢奥斯卡。您提出的建议确实奏效了。但是,我设法找到了一种更好的方法,您可以使用自定义数据注释来执行我的 "primitive login" 操作。
经过更多研究后发现,实施 FilterAttribute class 以及 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
}
出于某些 experimental/exercise 目的,我试图在继续使用身份服务之前实现一个原始登录系统。
我的想法是创建自定义数据注释 - 就像身份的 [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
}
但是,我收到一条错误消息:"An object reference is required for the non static field, method or property 'Controller.Session'"
我既不能访问控制器之前的 Session[],也不能访问方法声明之前的 Session[]。我不知道如何实例化或引用。
有没有办法在我的案例中使用 Session[]?因为我不想用
这样的 if 语句手动检查每个方法if(Session["UserId"] != null) {}
我们非常欢迎任何替代解决方案。
注意:我知道使用 Session 不是实现此类任务的推荐方法。但我的目的是在使用高级身份服务之前了解登录操作的工作原理。
有没有办法在我的案例中使用 Session[]?
不像您现在所做的那样,但您可以在自定义属性代码中使用 HttpContext.Current.Session 而不是将其作为 属性 传递。
非常感谢奥斯卡。您提出的建议确实奏效了。但是,我设法找到了一种更好的方法,您可以使用自定义数据注释来执行我的 "primitive login" 操作。
经过更多研究后发现,实施 FilterAttribute class 以及 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
}