我已经使用c#和asp.net创建了一个Web身份验证应用程序,并希望避开您认为它的安全性.所有导航均由https完成.
用户注册
用户输入3个数据点(SSN,Lname和DOB).如果在我们的系统中找到该组合,则会设置会话变量并导航到下一页.
如果设置了#1的会话变量,请继续并询问用户名,密码,安全问答等.使用Linq保存数据并在实际保存事件之前验证会话变量.使用salt和sha对PWD和安全性答案进行哈希处理.(使用验证控件和文本框限制来限制输入)
重设密码
与注册中的#1相同,但包括用户名.如果确定,请设置第1步会话变量.
如果设置了第1步会话变量,请提出最多3倍的安全问题.Salt/hash并验证数据库salt/hash.如果匹配,则设置步骤2会话变量.(使用验证控件和文本框限制来限制输入)
检查第2步会话变量.请求新的密码.哈希/盐并使用LINQ保存.
登录(使用验证控件和文本框限制来限制输入)
收集用户名和密码.与用户名匹配的HASH/salt密码,查看密码是否与hash匹配.如果没问题,请设置用户对象并传递到默认页面.
所有页面都从masterpage继承.Masterpage具有验证用户对象是否设置为有效实例的代码.如果没有有效的用户对象,则调用注销,重定向到主登录页面.
有点罗嗦,但想要清楚.
我在这里错过了什么吗?我想使用MS的表单auth,但决定自己滚动,因为我有一些问题,我想用FBA完成一些自定义的东西.通过使用会话变量作为步骤完成标记,这是否足以防止会话窃取或书签?有一个更好的方法吗?
请问好吗?
ASP.NET Forms身份验证或使用Membership Provider位的哪些方面不符合您的需求?我发现在很多不同的场景中都非常灵活?
滚动你自己通常会在未来使生活变得艰难,特别是当你需要开始做出改变时.您还可以使用母版页来验证用户登录状态等,但是当您需要更多母版页时,您需要在每个母版页中复制相同的代码块并使其保持一致.然后,这可能成为未来某个地方的维护噩梦.
如果您没有在框架中使用现成的烘焙认证工具,那么您应该在其他地方管理这种事情,例如在HttpModule中.
我想你应该重温你正在做的事情.IIdentity
如果需要从用户对象挂起用户特定的数据/对象,请查看实现自己的自定义对象.然后分配给IPrincipal
您可以附加到Context.User
ASP.NET中的自定义.
@ asp316和@Jack(评论)我建议抓住这两本书:
由Dominick Baier 开发更安全的Microsoft®ASP.NET2.0应用程序
Stefan Schackow的专业ASP.NET 2.0安全性,成员资格和角色管理
您会惊讶于.NET内置的安全基础架构的灵活性.除了
向web.config 添加设置和
在页面上打一个控件之外,还有很多其他功能.
关于"滚动你自己"的事情是,它很容易以微妙的方式弄错,以至于看起来有效.然后,当然,您可以部署此代码并继续处理其他事情,而不知道出现任何问题.毕竟,它通过了所有测试.
一年之后,事实证明你的网站在六个月前遭到黑客攻击,直到那时你才知道它.
更好地找到依赖安全专家编写的实现的方法.