我们有一个使用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)服务)。有谁知道吗?
在Windows 2008(我的Web应用程序也在NETWORK SERVICE下运行)或Windows 2008 R2(它作为应用程序池标识帐户运行)上不会发生此问题。
感谢您的帮助!