Web应用程序架构(javascript客户端+ ASP.NET服务器端)

时间:2016-07-06 20:29:05

标签: html asp.net angularjs identity

这个问题来自以下帖子:

OWIN cookie authentication get roles on client side

我为这个问题创建了一个单独的帖子,因为它比上面的帖子更通用。

简而言之:

假设我们有一个Web应用程序,其中javascript作为客户端+ ASP.NET web api作为服务器端,也是一个身份服务器。只有经过身份验证的用户才能访问Web api端点,其中一些端点只能访问用户的特定角色。

现在,应用程序的客户端应根据用户所处的角色显示特定项目。例如:管理员角色的用户可以看到一个额外的选项卡:管理项目。有两种方法可以实现这一目标:

  1. 在渲染客户端应用程序时,可以在web api中调用endpoind,它将返回用户拥有的角色。根据该结果,在html中显示/隐藏项目。

  2. 当应用程序加载时,将返回一个返回结构外观的端点(例如:json string),并根据该结构呈现客户端应用程序。在这种情况下,不会根据角色在客户端显示/隐藏html。

  3. 现在关于第一点:有些人可能认为存在安全漏洞,因为恶意用户可以修改html以查看他不应该看到的元素。但在这种情况下,他不会看到来自数据库的任何内容,也无法加载/更新它,因为根据他在服务器端检查的角色,他将无权执行此操作。

    第二点似乎更有效,因为我们在服务器端保留所有与身份相关的信息逻辑。并且所有不必要的内容都不在html中(而在第一点它是隐藏的) - 这样可以带来更好的性能?在这种情况下,尽管例如开发角度应用,应用的json结构应该包括诸如角度控制器的名称和路径之类的信息。这不会增加开发应用程序的复杂性吗?

    假设应用程序本身具有很多角色,并且根据这些角色,许多项目应该可见/不可见。

    第1和第2之间的优缺点?谢谢!

1 个答案:

答案 0 :(得分:1)

我始终坚持第一个建议点。

正如您所提到的,第二种选择会增加开发的复杂性。对于第一个没有安全漏洞。如果您不希望用户修改html并访问应用中的禁止区域,只需使用ng-if代替ng-show。如果您不熟悉,ng-if不会仅使用display: none;隐藏内容。它将完全从DOM中删除它,这导致用户无法显示该内容,因为它不在DOM中。

有关ng-ifng-show的详细说明,请阅读此内容:what is the difference between ng-if and ng-show/ng-hide

我通常有一个端点获取有关用户的信息 - 包括它的角色并将该用户保存到服务(工厂)中。这使我可以灵活地在应用程序的任何地方使用它,并检查用户是否可以访问它的某些部分。