【发布时间】:2013-07-18 04:55:48
【问题描述】:
我正在设计一个基于 Soa 原则的系统。对于身份验证,将使用传统的令牌方法。 但是需要根据访问功能的用户的角色,在消费者应用程序内激活或停用按钮和标签的位置进行授权。
这些应用程序正在 wpf (prism) 上开发。
是否有已知且经过验证的方法来处理此问题?
我们应该设计我们的自定义机制吗?
谢谢!
【问题讨论】:
标签: prism soa user-permissions user-roles
我正在设计一个基于 Soa 原则的系统。对于身份验证,将使用传统的令牌方法。 但是需要根据访问功能的用户的角色,在消费者应用程序内激活或停用按钮和标签的位置进行授权。
这些应用程序正在 wpf (prism) 上开发。
是否有已知且经过验证的方法来处理此问题?
我们应该设计我们的自定义机制吗?
谢谢!
【问题讨论】:
标签: prism soa user-permissions user-roles
几个答案:
是否有一种已知且行之有效的方法来处理这个问题?
是的,有几种方法。您正在寻找的是所谓的外部授权(这是一个原则)。不同的框架和语言有不同的实现方式,例如Spring Security / Spring EL(在 Java Spring 世界中)或 .NET 世界中的 MS Claims。有技术解决方案,也有标准(例如 RBAC、ABAC、XACML...) ABAC,基于属性的访问控制模型将允许您在称为策略决策点 (PDP) 的中心位置定义授权,然后通过策略执行点 (PEP) 将您的不同应用程序和层连接到 PDP。这意味着您可以将相同的授权规则应用于表示层 (WPF) 和其他层(例如,带有 WCF 的服务层......)
我们应该设计我们的自定义机制吗?
否 :-) 重用已经存在的内容并尽可能使用标准。出于好奇,您是重新发明了一种用于身份验证的令牌类型,还是使用标准类型,例如SAML 还是 Kerberos?
免责声明:我为 XACML 供应商 Axiomatics 工作。
我不知道有任何开源 .NET XACML 实现,但 Axiomatics 确实提供了您可能感兴趣的商业解决方案。
【讨论】:
WPF Prism 不处理授权(根据this)。因此,您需要自己构建解决方案。
我建议查看基于声明的授权(Managing Claims and Authorization with the Identity Model 可以为您提供高级视图)。您可以使用的声明示例包括:“UserCanSaveCustomerSettings”、“UserHasCustomerManagementPrivelege”。
为您的应用程序配置声明后,您可以使用此信息来启用/禁用控件。我可以建议你两个选择。
如果您使用 MVVM 模式,您可以将访问信息(例如,您可以从 ClaimsPrincipalPermission.CheckAccess 获取)公开为 ViewModel 的属性,并将此属性直接绑定到控件。就像是
或者,您也可以实现 IValueConverter,然后通过 ClaimsPrincipalPermission.CheckAccess 或直接通过 ClaimsAuthorizationManager.CheckAccess 再次访问声明。
此外,您可能需要考虑到您的安全性不应基于仅启用/禁用控件。例如,在 WPF 中有许多工具(例如Snoop)可以轻松启用/取消隐藏/单击任何控件。您可能还想检查您的应用程序/服务层中的访问权限(您也可以使用基于声明的授权,检查ClaimsPrincipalPermissionAttribute)。
【讨论】: