PrincipalPermissionAttribute 要求来自多个域的相同角色
PrincipalPermissionAttribute demand same role from multiple domains
设置
我的 WCF 网络服务在 Windows 服务器 2012 上的 IIS 8.0 上运行,环境中有多个域:
- 服务器
- 老客户
- 客户端-新
应用程序池使用 SERVER
域中的服务帐户运行(比方说 SEVER\WsSvc01
)。
我的 WCF 网络服务使用这样的 PrincipalPermissionAttribute
:
[PrincipalPermission(SecurityAction.Demand, Role = "grp_WsUsers")]
public string Echo(string message)
{
return string.Format("{0:o}: {1}", DateTime.Now, message);
}
两个客户端域中都有一个 grp_WsUsers
活动目录组:
- CLIENT-OLD\grp_WsUsers
- CLIENT-NEW\grp_WsUsers
问题
来自 CLIENT-OLD
域且属于 CLIENT-OLD\grp_WsUsers
的用户可以 访问 CLIENT-NEW
域 [=41] 的服务用户=]不能
解决方法
如果我明确包括这两个组,则所有用户都可以访问该服务
[PrincipalPermission(SecurityAction.Demand, Role = "CLIENT-OLD\grp_WsUsers")]
[PrincipalPermission(SecurityAction.Demand, Role = "CLIENT-NEW\grp_WsUsers")]
public string Echo(string message)
{
return string.Format("{0:o}: {1}", DateTime.Now, message);
}
问题
这里发生了什么?如果我必须明确指定组,为什么它首先起作用?我怎样才能消除两组之间的差异?
所以我终于想通了:
由 PricipalPermissionAttribute
调用的权限检查只是在它遇到的任何域中查找 第一个 组的名称,然后停止 即使当前用户没有群组。
所以在我的例子中,实现首先在 CLIENT-OLD
域中查找组,并且由于存在具有相关名称的组,因此检查该特定组(我假定为组 SID)的所有用户。
设置
我的 WCF 网络服务在 Windows 服务器 2012 上的 IIS 8.0 上运行,环境中有多个域:
- 服务器
- 老客户
- 客户端-新
应用程序池使用 SERVER
域中的服务帐户运行(比方说 SEVER\WsSvc01
)。
我的 WCF 网络服务使用这样的 PrincipalPermissionAttribute
:
[PrincipalPermission(SecurityAction.Demand, Role = "grp_WsUsers")]
public string Echo(string message)
{
return string.Format("{0:o}: {1}", DateTime.Now, message);
}
两个客户端域中都有一个 grp_WsUsers
活动目录组:
- CLIENT-OLD\grp_WsUsers
- CLIENT-NEW\grp_WsUsers
问题
来自 CLIENT-OLD
域且属于 CLIENT-OLD\grp_WsUsers
的用户可以 访问 CLIENT-NEW
域 [=41] 的服务用户=]不能
解决方法
如果我明确包括这两个组,则所有用户都可以访问该服务
[PrincipalPermission(SecurityAction.Demand, Role = "CLIENT-OLD\grp_WsUsers")]
[PrincipalPermission(SecurityAction.Demand, Role = "CLIENT-NEW\grp_WsUsers")]
public string Echo(string message)
{
return string.Format("{0:o}: {1}", DateTime.Now, message);
}
问题
这里发生了什么?如果我必须明确指定组,为什么它首先起作用?我怎样才能消除两组之间的差异?
所以我终于想通了:
由 PricipalPermissionAttribute
调用的权限检查只是在它遇到的任何域中查找 第一个 组的名称,然后停止 即使当前用户没有群组。
所以在我的例子中,实现首先在 CLIENT-OLD
域中查找组,并且由于存在具有相关名称的组,因此检查该特定组(我假定为组 SID)的所有用户。