表单身份验证

5
我已经从事编程工作很长时间了,但并不是最有经验的.Net开发人员。我最近接手了一个使用Forms身份验证的项目。我最初看过.Net 1.1中的表单身份验证,当时它有一些限制,使我决定不将其用作我的主要身份验证形式。
该项目要求用户具有角色(我知道表单身份验证支持)和组成员资格。例如,“用户A”是“公司A”的“管理员”。现在的表单身份验证是否支持这种用户结构?
我还读到表单身份验证以明文方式发送密码。这个客户端不使用SSL。这是真的吗?
当前代码库使用表单身份验证,但不支持组(支持角色)。因此,我需要修改表单身份验证以支持所需的组,或者删除表单身份验证并使用我通常使用的身份验证框架。如果表单身份验证支持组并且足够安全,那么我应该坚持使用。如果表单身份验证存在安全问题或不支持组,则需要删除该身份验证形式。
我在互联网上搜索了一篇利弊分析文章,但没有找到。你们认为呢?

不,我可以使用2.0或3.5。只是我一开始决定不喜欢1.1后就没有回去学习表单身份验证。从我所读的内容来看,现在看起来更好了,但我想先听听意见。 - mlindegarde
7个回答

5
为满足您的要求,您将使用Membership的表单验证。如果您的应用程序正在使用SQL Server数据库,则可以使用SQLMembershipProvider作为成员提供程序来实现此目的。 检查ASP.NET 2.0的成员身份、角色和配置文件可能是一个很好的起点参考。
关于您对于在连接未加密时发送密码的担忧。
实际上,发送的密码通常被哈希(算法取决于所选择的成员提供程序),并且这就是它们最终存储的方式。 当然,如果连接未加密,那么可以检索到该哈希密码并用于攻击应用程序,但至少可以消除明文用户密码被盗用的可能性,例如用于访问其他服务(如您所知,许多人在多个服务中使用相同的密码)。因此,在此处确保安全,您确实需要使用https。
作为警告,我远非该领域的专家,但最近我遇到了你所描述的类似问题,因此我认为你可能会发现其中一些有用。

稍微解释一下:密码是以散列的形式发送到数据库中的。密码不会在浏览器中发送,只有在提交登录表单时才会接收(必须使用https)。角色提供程序不处理他的角色/公司要求,也不处理基本的RoleProvider(尽管你可以聪明地使用Admin-CompanyA :))。 - eglasius
谢谢提供链接,非常有信息量。我想点个“赞”,但是我的声望还不够高。 - mlindegarde
@Freddy - 感谢你的指点 - 我应该学会不要在周五下午回答问题 - 特别是如果是13号星期五 ;). 我找到一些空闲时间后会编辑我的回答。 - kristof

1

表单身份验证不会以明文形式发送密码。只要在接收时确保登录/密码受到保护(即使用https ... ssl),那么其中就没有安全风险。

如果您真的需要以这种方式进行授权,可以依靠表单身份验证进行身份验证,并使用自己的机制进行授权。


正如我所提到的,他们没有使用HTTPS/SSL,这是我的担忧;不过,无论如何,我想它被发送到服务器时都会作为明文传输。我在考虑是否可以使用表单身份验证,然后根据身份验证提供的ID进行自己的授权。 - mlindegarde
你可以自己进行授权,但最简单的方法(不是唯一的方法)是获取用户名而不是ID - HttpContext.Current.User.Identity.Name(在登录后)。 - eglasius

1

Forms Auth是您想要的绝佳选择。它支持角色,但不支持组。但是,它内置了对Active Directory集成的支持,如果需要,您可以使用它来解决组问题。个人建议您坚持现有的方式并学习更多相关知识。如果您想使用Forms Auth的Forms模式而不是AD auth模式,则可以考虑使用现有的forms auth数据库构建组支持。

我强烈推荐观看Microsoft关于Forms Authentication的这些视频。您会发现它非常容易使用。当然,它不是一件轻松的事情,因为它是一个相当强大和灵活的框架。您需要阅读相关资料并观看这些视频。但是,当您熟悉它后,您会发现它是安全的,得到开发社区的广泛支持。

天啊,我刚刚再次审查了您的问题,您说他们不使用SSL。这个网站需要多安全?对我来说,我的首要任务就是转移到SSL!


重要的是要注意这是一个互联网(而不是内联网)应用程序。当用户通过互联网注册网站时,您仍然可以使用Active Directory吗?我不是Windows安全专家,但我认为Active Directory仅适用于内部网络。 - mlindegarde
是的,您可以使用外部面向的AD林并进行身份验证。 - Bill Martin

1

表单身份验证不会本地支持组。我们所做的是使用它来“验证”用户(证明他们是谁),然后使用我们自己的数据存储来“授权”用户(描述他们可以做什么)。


0

如果您没有使用SSL,则必须明文传递密码。因此需要SSL。

.Net Forms身份验证将正确地哈希和存储密码到数据库中,但这不会保护凭据在传输过程中的安全性。但是,所有Web框架都适用于此。

至于组件部分,您将不得不在应用程序中实现此功能或查找一些库来帮助您。


0

数据库不存储明文密码,而是使用MD5或其他哈希方式...我知道他们会将两个哈希字符串进行匹配以验证是否相同,无论是在客户端还是服务器端转换字符串,我不确定...可能是浏览器...如果您考虑使用SSL,我认为您不应该使用ASP.net表单身份验证...现在是时候自己做基于表单的身份验证并深入了解一些广告挖掘了...


0

感谢所有的建议。虽然我认为在其他项目中我会继续使用自己的身份验证库,但我认为对于这个客户来说,最好的做法是坚持他们已经部分实施的表单身份验证。

虽然我使用Visual Studio和.Net平台进行开发,但我并不总是喜欢按照“微软”的方式去做事情。我发现很多时候,“微软”的方式会引入很多不必要的开销,如果你知道该怎么做,就可以避免这些开销。

再次感谢您的建议。


好在没有人强制你在这里使用任何东西。 - Lex Li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接