我有一个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,不需要新的方法.为了控制存储库初始化,您必须在每个实现中的存储库本身中实现某种延迟/延迟初始化.我不喜欢这个解决方案,因为它增加了不必要的复杂性,更重要的是增加了控制器和存储库之间的耦合.存储库实现可以在其他上下文中使用,其中懒惰初始化没有意义恕我直言.
我正在尝试从抽象基类中删除服务定位器,但我不确定要用什么来替换它.这是我所得到的一个假例子:
public abstract class MyController : Controller
{
protected IKernel kernel;
public MyController(IKernel kernel) { this.kernel = kernel); }
protected void DoActions(Type[] types)
{
MySpecialResolver resolver = new MySpecialResolver(kernel);
foreach(var type in types)
{
IMyServiceInterface instance = resolver.Get(type);
instance.DoAction();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个问题是派生类的instanciator不知道内核必须具有什么绑定才能防止MySpecialResolver抛出异常.
这可能是内在难以处理的,因为我从这里不知道我将要解决哪些类型.派生类负责创建types参数,但它们在任何地方都不是硬编码的.(这些类型基于派生类的组合层次结构中存在的属性.)
我试图通过延迟加载代理来解决这个问题,但到目前为止我还没有想出一个干净的解决方案.
这里确实存在两个问题,一个是IoC容器被传递给控制器,充当服务定位器.这很容易删除 - 您可以使用各种技术在调用堆栈中向上或向下移动位置.
第二个问题是困难的问题,如果需求在运行时没有暴露,如何确保控制器具有必要的服务.它应该从一开始就很明显:你做不到!您将始终依赖于服务定位器的状态或集合的内容.在这种特殊情况下,任何数量的小问题都不会解决本文中描述的静态类型依赖关系的问题.我认为我最终要做的是将一个Lazy数组传递给控制器构造函数,并在缺少必需的依赖项时抛出异常.
c# dependency-injection inversion-of-control service-locator
根据.NET Framework一般参考:错误提升和处理指南在"正常"操作期间不应抛出异常.无效的用户输入到Web表单,比如用户输入重复的名称,被认为是正常的?!重要!!:我确信我们几乎都对此有意见,请提供可靠来源的参考.
编辑:
更多背景:我正在质疑我正在阅读的一本书提倡的模型验证方法.本书建议您在提供无效数据时从存储库中抛出自定义异常.现在,在我看来,这违反了MS指南,因为您使用异常作为流控制...除非在"正常"操作之外考虑接收无效数据.我只是想看看是否有来自可靠来源的任何进一步指导来解决这个问题.
另一个编辑:
好吧两年半之后,我正在将此存储库移动到WCF服务,并且在此方法中使用异常被证明是个坏主意.那好吧.
我们正在使用NHibernate开始一个新项目,并考虑使用NHibernate.Linq(3.0中的嵌入式版本,而不是contrib项目).我知道这是一个相对较新的补充.有没有人使用当前的LINQ for NHibernate?它对于真实世界的应用程序是否足够成熟?
具体而言,您是否遇到过困难,性能如何,是否存在导致您出现问题的支持方面的任何重大差距?
谢谢!
我正在为AngularJS编写一个非常简单的指令,该指令应该转换为:
<input type="text" name="FirstName" mydirectivename />
Run Code Online (Sandbox Code Playgroud)
进入这样的事情:
<span><input type="text" name="FirstName" /></span>
Run Code Online (Sandbox Code Playgroud)
到达这里很容易:
<span type="text" name="FirstName"><input/><span>
Run Code Online (Sandbox Code Playgroud)
但是现在我在编写一个编译功能的杂草中做了文档说"你应该很少需要做的事情"而且我认为我偏离了轨道.是否有一种简单的方法来指示模板中的特定元素应该是复制属性的目标?
谢谢
我有一个问题,我不知道如何最好地解决.
我有一个应用程序,它更新数据库以响应临时请求.特别是一个请求很常见.请求是一个更新,它本身很简单,但有一些复杂的前提条件.
最后一步是问题,此命令取决于数据库的状态,该状态可能在业务逻辑运行后发生了变化.在数次往返数据库的过程中锁定此操作中读取的数据似乎也不是一个好主意.是否有"最佳实践"方法来完成这样的事情?谢谢!
使用多种算法会使密码更安全吗?(或更少?)
为了清楚起见,我不是在谈论做这样的事情:
key = Hash(Hash(salt + password))
Run Code Online (Sandbox Code Playgroud)
我在谈论使用两个独立的算法并匹配两者:
key1 = Hash1(user_salt1 + password)
key2 = Hash2(user_salt2 + password)
Run Code Online (Sandbox Code Playgroud)
然后要求两者在验证时匹配.我已经看到这被建议作为消除碰撞匹配的一种方式,但我想知道意外后果,例如创建"最薄弱的链接"场景或提供使用户数据库更容易破解的信息,因为这种方法提供的数据多于一把钥匙就可以了.例如,将信息与哈希相结合以更容易地找到它们.此外,如果真的消除了碰撞,理论上你可以强制实际密码而不仅仅是匹配的密码.事实上,你必须要彻底强制系统.
我实际上并没有计划实现这一点,但我很好奇这是否实际上是对单一标准做法的改进key = Hash(user_salt + password).
编辑:
许多好的答案,所以只是为了猜测,这应该是显而易见的回顾,但你确实通过使用两者创建了一个最薄弱的环节,因为两个算法中较弱的匹配可以尝试对抗另一个.例如,如果您使用了弱(快)MD5和PBKDF2,我先强制MD5,然后尝试我发现的任何一个匹配,所以通过让MD5(或其他)实际使情况变得更糟.即使两者都是更安全的设置(例如bcrypt + PBKDF2),你也可以将其中一个暴露给其中一个.
我正在编写一个控制台工具来为类库中的对象生成一些C#代码.我可以实际生成代码的最好/最简单的方法是在构建库之后使用反射.它运作得很好,但这似乎是一个随意的approch充其量.由于生成的代码将使用库进行编译,因此在进行更改后,我需要构建解决方案两次以获得最终结果,等等.其中一些问题可以通过构建脚本来缓解,但它仍然感觉像是对我来说太过分了.
我的问题是,对于这类事情,是否有任何高级别的最佳做法?
在ASP.NET MVC3中,我试图设置验证错误辅助方法设置的css类.(不是这个问题,接受的答案只是ADDS该类,我想完全覆盖它.)在查看MVC3源代码时,我ValidationInputCssClassName在HtmlHelper类中找到了该属性.它是可设置的,如果设置,它会将值存储在存储提供程序中.属性的get方法返回[提供者值] ??[默认类名].
现在,如果您只是在控制器代码中键入HtmlHelper.ValidationInputCssClassName(MSDN条目),您将看到它是一个静态只读字段.原因是有两个HtmlHelper类,一个在System.Web.Mvc命名空间中,另一个在System.Web.Webpages.Html命名空间中.可以设置属性System.Web.Webpages.Html.HtmlHelper.ValidationInputCssClassName(MSDN条目),但无论在何处设置它,它似乎都不会对生成的代码产生任何影响.
我错过了什么?这些课程有什么区别?
asp.net-mvc ×2
c# ×2
.net ×1
angularjs ×1
architecture ×1
asp.net ×1
asynchronous ×1
browser ×1
hash ×1
html-helper ×1
linq ×1
nhibernate ×1
reflection ×1
security ×1
sql ×1