我有一个ASP.NET MVC应用程序,其控制器看起来像这样:
[Authorize]
public class MyController : Controller
{
IMyRepository myRepository;
public MyController(IMyRepository myRepository)
{
   this.myRepository = myRepository;
}
...
}
Run Code Online (Sandbox Code Playgroud)
我注意到在验证用户之前会调用此构造函数,因此如果您是第一次访问该页面,则会在重定向到登录屏幕之前调用构造函数.这有很多问题,登录页面加载速度较慢,网站更容易受到DOS攻击,我对未经验证的未经授权的用户有点紧张,他们可以调用"墙后"代码.
我可以检查构造函数中的incomming请求并保释,除非用户被授权,但我正在使用IOC(Windsor),这使得它有点棘手,我的存储库将被初始化,无论我是否存储实例,所以我将在每个存储库的构造函数中检查身份验证.有没有一种简单的方法可以让.NET MVC 在调用构造函数之前对用户进行身份验证?我正在考虑添加[PrincipalPermission(SecurityAction.Demand, Authenticated = true)]到控制器,但可能还有更好的方法.
编辑:
好吧,不太高兴,但这个节目现在必须继续.我不能延迟初始化存储库,直到控制器内的某个稍后的时间点.当您的控制器在我的示例中使用IOC时,您将在实例化控制器时获得已实例化的存储库接口实现.如果我可以控制正在创建的存储库,我可以很容易地调用IsAuthenticated,不需要新的方法.为了控制存储库初始化,您必须在每个实现中的存储库本身中实现某种延迟/延迟初始化.我不喜欢这个解决方案,因为它增加了不必要的复杂性,更重要的是增加了控制器和存储库之间的耦合.存储库实现可以在其他上下文中使用,其中懒惰初始化没有意义恕我直言.