我正在设计一个基于Soa原则的系统。对于身份验证,将使用传统令牌方法。 但是,根据访问该功能的用户的角色,需要在授权消费者应用程序中激活或停用按钮和标签。
应用程序正在wpf(prism)上开发。
有没有经过验证的方法可以解决这个问题?
我们应该设计自定义机制吗?
谢谢!
答案 0 :(得分:3)
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)。
答案 1 :(得分:0)
一些答案:
有没有一种经过验证的方法来解决这个问题?
是的,有几种方法。您正在寻找的是外部授权(这是一个原则)。不同的框架和语言具有不同的实现方法,例如Spring安全/ Spring EL(在Java Spring世界中)或.NET世界中的MS声明。有技术解决方案,有标准(例如RBAC,ABAC,XACML ......) ABAC,基于属性的访问控制模型将允许您在称为策略决策点(PDP)的中心位置定义授权,然后通过策略执行点(PEP)将您的不同应用程序和层连接到PDP。这意味着您可以将相同的授权规则应用于表示层(WPF)和其他层(例如,带有WCF的服务层......)
我们应该设计自定义机制吗?
否:-)重复使用已存在的内容并尽可能使用标准。出于好奇,您是否重新发明了令牌类型以进行身份验证,或者您是否使用标准类型,例如SAML还是Kerberos?
免责声明:我为XACML供应商Axiomatics工作。
我不知道任何开源.NET XACML实现,但Axiomatics确实提供了您可能感兴趣的商业解决方案。