【问题标题】:Converting Declaractive PrincipalPermission to Programmatic .Demand将声明式 PrincipalPermission 转换为程序化 .Demand
【发布时间】:2011-05-28 14:12:43
【问题描述】:

我目前有两个这样的角色:

[PrincipalPermission(SecurityAction.Demand, 角色="域\管理员")] [PrincipalPermission(SecurityAction.Demand, Role="Domain\AnotherRole")]

问题是这个继承的代码是特定于域的,我想最终从 web.config 文件中获取角色,所以我可以在不在域中的 VM 上工作。

我见过这样的例子:

PrincipalPermission permCheck = new PrincipalPermission(
                                     null, 
                                     @"Domain\Admin"); 
permCheck.Demand();

由于如果用户不在角色中这会引发异常,我如何更改此示例以允许两个角色中的任何一个?我可以使用多个 IPrincipal.IsInRole() 然后抛出我自己的异常,但似乎有一种方法可以使用具有多个角色的 .Demand 方法。

12/21 更新:基于以下 Ladislav 回答的 Union 链接的示例代码:

PrincipalPermission ppAdmin = new PrincipalPermission(null, @"Domain\Admin");
PrincipalPermission ppAnother = new PrincipalPermission(null, @"Domain\AnotherRole");
(ppAdmin.Union(ppAnother)).Demand();

但是 AzMan(由 Ladislav 建议看起来是一个更好但更复杂的解决方案)。

【问题讨论】:

    标签: asp.net wcf security principalpermission


    【解决方案1】:

    PrincipalPermission 有Union 方法。此方法允许您在调用 Demand 之前组合多个 PrincipalPermission。但您可以检查Authorization manager (AzMan) 和相关角色提供者(AuthorizationStoreRoleProvider),而不是使用命令式权限。授权管理器允许您在应用程序中定义抽象角色并通过 MMC 分配真实的用户组和角色。

    【讨论】:

    • 谢谢!我用您链接到的网页中的“联合”样本更新了原始问题。 AzMan 看起来也很酷,但需要更多的认可和政治。
    • AzMan 自 Windows Server 2012 R2 起已弃用,可能会在后续版本中删除
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    相关资源
    最近更新 更多