这个问题来自以下帖子:
OWIN cookie authentication get roles on client side
我为这个问题创建了一个单独的帖子,因为它比上面的帖子更通用。
简而言之:
假设我们有一个Web应用程序,其中javascript作为客户端+ ASP.NET web api作为服务器端,也是一个身份服务器。只有经过身份验证的用户才能访问Web api端点,其中一些端点只能访问用户的特定角色。
现在,应用程序的客户端应根据用户所处的角色显示特定项目。例如:管理员角色的用户可以看到一个额外的选项卡:管理项目。有两种方法可以实现这一目标:
在渲染客户端应用程序时,可以在web api中调用endpoind,它将返回用户拥有的角色。根据该结果,在html中显示/隐藏项目。
当应用程序加载时,将返回一个返回结构外观的端点(例如:json string),并根据该结构呈现客户端应用程序。在这种情况下,不会根据角色在客户端显示/隐藏html。
现在关于第一点:有些人可能认为存在安全漏洞,因为恶意用户可以修改html以查看他不应该看到的元素。但在这种情况下,他不会看到来自数据库的任何内容,也无法加载/更新它,因为根据他在服务器端检查的角色,他将无权执行此操作。
第二点似乎更有效,因为我们在服务器端保留所有与身份相关的信息逻辑。并且所有不必要的内容都不在html中(而在第一点它是隐藏的) - 这样可以带来更好的性能?在这种情况下,尽管例如开发角度应用,应用的json结构应该包括诸如角度控制器的名称和路径之类的信息。这不会增加开发应用程序的复杂性吗?
假设应用程序本身具有很多角色,并且根据这些角色,许多项目应该可见/不可见。
第1和第2之间的优缺点?谢谢!
答案 0 :(得分:1)
我始终坚持第一个建议点。
正如您所提到的,第二种选择会增加开发的复杂性。对于第一个没有安全漏洞。如果您不希望用户修改html并访问应用中的禁止区域,只需使用ng-if
代替ng-show
。如果您不熟悉,ng-if
不会仅使用display: none;
隐藏内容。它将完全从DOM中删除它,这导致用户无法显示该内容,因为它不在DOM中。
有关ng-if
和ng-show
的详细说明,请阅读此内容:what is the difference between ng-if and ng-show/ng-hide
我通常有一个端点获取有关用户的信息 - 包括它的角色并将该用户保存到服务(工厂)中。这使我可以灵活地在应用程序的任何地方使用它,并检查用户是否可以访问它的某些部分。