asp.net-mvc – 认证之前调用的ASP.NET MVC控制器构造函数

我有一个ASP.NET MVC应用程序与控制器看起来像这样:
[Authorize]
public class MyController : Controller
{
IMyRepository myRepository;
public MyController(IMyRepository myRepository)
{
   this.myRepository = myRepository;
}

...
}

我已经注意到这个构造函数在进行身份验证之前被调用了,所以如果你在第一次访问该页面之前调用构造函数,然后再将你重定向登录屏幕.这有很多问题,登录页面加载速度较慢,网站有更大的暴露于DOS攻击,我对未经身份验证的用户有一点紧张,未经授权的用户能够调用“墙后面”的代码.

我可以检查构造函数中的进入请求,除非用户被授权,否则我使用IOC(Windsor),这样做有点棘手,我的存储库将被初始化,无论我是否存储实例,所以我将在每个仓库的构造函数中检查身份验证.在调用构造函数之前,有没有简单的方法让.NET MVC验证用户?我正在考虑将[PrincipalPermission(SecurityAction.Demand,Authenticated = true)]添加到控制器,但可能还有一个更好的方法.

编辑:

好的,不太高兴,但现在必须继续.我无法延迟初始化存储库,直到控制器内的某个稍后的时间点.当控制器在我的例子中使用IOC时,在实例化控制器时,您将获得已经实例化的存储库接口的实现.如果我控制了创建的存储库,我可以很容易地调用IsAuthenticated,不需要一个新的方法.为了控制存储库初始化,您必须在每个实现中在存储库本身中实现某种延迟/延迟初始化.我不喜欢这个解决方案,因为它增加了不必要的复杂性,更重要的是控制器和存储库之间的耦合.存储库实现可以用于其他延迟初始化对IMHO无意义的上下文中.

解决方法

控制器需要在授权发生之前进行实例化,因为它可以通过OnAuthorization方法作为自己的授权过滤器.改变这种行为将涉及替换mvc管道的一些核心部分.你认为AuthorizedAttribute可能不会做的工作有什么特别的原因吗?

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....