ASP .NET MVC最佳实践:在用户工作期间进行身份验证并保持用户认证状态

5
我正在调查这个问题,并得到了许多不同的建议,有人可以详细说明一下这个主题吗?
- 现有方法 - 限制 - 优缺点 - 防止攻击的保护措施
我希望得到一个简短的回顾,以获得方向。
编辑:
受众是全球需要注册的用户。

保持用户在工作期间的身份验证。有很多方法可以对用户进行身份验证;ASP.NET Identity是最新的一种。您要解决什么样的问题?否则,您的问题太宽泛了。 - Win
2
@shdr,你的同事们已经点赞了这个问题,但它几乎没有意义,这几乎不是英语...我会在你的悬赏过期后立即投票关闭。 - Brian Ogden
最好是你进一步定义应用程序的参数。例如,它只能内部使用/外部使用/两种都有?有没有现场实施的Active Directory?Azure Active Directory?你是在本地托管它吗?还是在Azure上?或者是外部提供商? - Travis Acton
身份验证服务器控制的JWT令牌? - Jay
@Travis Acton,你说得对,我需要更详细地说明一下:这个应用程序是为全球用户提供服务而设计的,他们需要注册才能使用。我会修改我的问题。 - shdr
@BrianOgden 对不起,假设你是正确的(事实并非如此),这合法吗? - shdr
3个回答

4
从我有过专业经验的一些系统中,我在这里提供一个答案:
注意:如果您回答我在评论中提出的关于应用程序参数的问题,我可以进一步定义正/负面。
ASP.NET Identity
这是一个基本的MS用户系统,它使用用户名和密码,并随MVC框架一起发货。其中一个优点是,该概念已经存在了很长时间,并且有大量的教程向您展示如何扩展它以使用诸如电子邮件/密码之类的东西,或者从用户那里收集某些数据,例如他们母亲的狗的中间名或其他任何信息。如果您有一个用户可能共享计算机的环境,请在此处查看。考虑工厂或医院设置等情况。其中一个缺点是,您基本上被迫在应用程序(或应用程序群集)中维护整个用户设置、应用程序角色和用户管理。当涉及到此时,请考虑表单身份验证。如果您的应用程序是外部的,并且暴露AD服务使您的安全团队感到不安,则可能需要查看此内容。
Windows Auth.
您基本上正在对Windows用户帐户进行身份验证,虽然不是必需的,但在大多数情况下,您将把像Active Directory这样的东西视为角色提供程序。其中一个优点是,您的应用程序实际上不再负责用户管理和所有相关支持(weeeeee!),而是更多地授权角色在应用程序中工作。这使得它变得轻松,但一个巨大的缺点是,如果您有可能共享计算机的用户,则这是一个巨大的安全噩梦。您需要定位拥有自己特定计算机的用户,他们来上班并坐在这个计算机旁边。如果您的应用程序在外部托管,则会变成一场噩梦,因为有些服务需要从外部访问AD,这样很容易使AD变得脆弱。
Forms/Windows混合模型
在这种情况下,您基本上需要配置您的网站以运行forms auth,但是您的forms auth系统设置为作为后台进程对AD中的用户进行身份验证。因此,当您有一些共享计算机和一些专用计算机的用户混合使用时,这更适用。您基本上正在设置自己的forms auth网站,该网站除了用户的AD名称和密码外,还接受重定向URL。然后,forms auth网站检查Active Directory中的用户凭据是否有效,设置诸如会话cookie之类的有趣内容,并将经过身份验证的用户重定向回您的MVC网站。在您的MVC网站上,您也有AD连接器(或者您可以具有N层设计来查找它),以告诉您用户隶属于哪些AD组并适当处理。因此,使用此类系统的优点是,您将单个网站的用户管理方面放回到AD中,但同时具有启动基本上为Windows Auth的应用程序的灵活性,以在具有混合用户(具有专用计算机和那些分享计算机的人)的环境中运行。其中的缺点是,初始第一次设置非常繁琐,因为您实质上正在构建多个系统。此外,安全性也是一个问题,因为任何时候您都有共享计算机环境,事情更容易受到滥用。您必须提出良好的会话超时策略,并遵循该策略。此外,您可以将您的forms与站点放置在DMZ中,并将外部托管的应用程序与直接与AD交互分开。其中一个缺点是,您需要处理AD锁定,密码重置,暴力破解等问题。
像OAuth这样的外部提供商,如Facebook,Twitter,Google。
我从未亲自在生产应用程序上走过这条路,因此无法为您提供现实世界的正面或负面意见,但需要提及并且可能其他人可以给我们一些见解。
对于这个回答中的大文本块表示抱歉,当我可以进入桌面时,将使格式更加“漂亮”。

我发现在政府、银行等网站上,它们使用了一种名为“token”的令牌,让我感觉好像是在通过一个令牌进行重定向,这个与你所说的“表单/窗口混合模型”有关吗?你知道吗? - shdr
@shdr 它可以是混合模型。 Token 或多或少替代了会话状态等内容。 您仍需要对用户进行身份验证和授权角色。 对于在无状态介质上运行的技术,Token 正变得越来越流行。 想想 iOS 或 Android 手机应用程序。 它在 MVC 中变得更加流行,因为单页应用程序现在是“时尚”的事情。 当您拥有基于浏览器的技术(例如 MVC),它将其应用程序作为一个页面加载,并且大量依赖 AJAX 回调到控制器或 API 服务层时,您将遇到会话状态超时问题。 - Travis Acton

1
如果您使用ASP.NET MVC框架,可以使用ASP.NET身份验证或外部提供程序(Google、Facebook、Microsoft等)对用户进行身份验证。
在Visual Studio中,如果创建一个新的ASP.NET MVC项目并选择使用个人帐户进行身份验证,它将为您设置Identity系统。 为了保持用户已验证状态,我通常会在要限制访问的控制器类上方添加[Authorize]属性。

0

我不知道这是否有帮助 -

但在用户进行工作时,我们始终使用SignalR来查看用户是否已连接并通过身份验证与服务器通信。


我对这个设置很好奇。你只是检查用户是否被授权来连接中心吗?我对SignalR有相当不错的理解,但从未听说过有人这样使用它。你能解释一下你的架构吗? - Travis Acton
我加入@TravisActon的问题。 - shdr
我们的架构是单页asp.net MVC应用程序,使用Knockout.js,其中大部分是部分视图。一旦用户通过任何身份提供者(Asp.Net Identity或Windows Auth或Google或其他)进行身份验证,并且我们将其用户详细信息保存在会话中,我们会定期轻量级调用服务器以确保用户主机仍然活动在服务器上。 - Ramesh

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