我们有一个使用 TCP 绑定的 WCF 服务,托管在 Windows 服务中。WCF 服务由 ASP.NET Web 应用程序调用。
当调用 WCF 服务时,我想检查调用身份是否是特定本地组的成员。有几种方法可以做到这一点:
[PrincipalPermission(SecurityAction.Demand, Authenticated = true, Role = "MyGroupName")]
Thread.CurrentPrincipal.IsInRole("MyGroupName");
new WindowsPrincipal(ServiceSecurityContext.Current.WindowsIdentity).IsInRole("MyGroupName")
当我们的 ASP.NET Web 应用程序托管在 Windows 2003/IIS6 中时,它在 NETWORK SERVICE 帐户下运行。这意味着必须将 NETWORK SERVICE 添加到本地组,WCF 代码才能正确运行。但是,如果我将帐户添加到组,然后测试我的应用程序(使用上述任何方法来测试组成员身份),代码似乎认为 NETWORK SERVICE 不是该组的成员。
我编写了一个简单的 ASP.NET 页面来执行相同的组成员资格测试。我发现网页只会在我执行iisreset后识别 NETWORK SERVICE 已加入该组。但是,重置 IIS 对我的 WCF 服务没有任何影响。我什至尝试重新启动托管我的 WCF 服务的 Windows 服务,但没有任何区别。只有在我重新启动计算机后,WCF 代码才意识到 NETWORK SERVICE 是该组的成员。
我试图了解为什么我的简单 ASP.NET 页面与我的 WCF 服务的行为会有所不同,特别是当它们使用相同的代码并且它们都报告相同的身份名称(NT AUTHORITY\NETWORK SERVICE)时。有人知道吗?
在 Windows 2008(我的 Web 应用程序也在 NETWORK SERVICE 下运行)或 Windows 2008 R2(它作为应用程序池身份帐户运行)上不会出现此问题。
谢谢你的帮助!