我有一个SecurityService
有一个AutoLogin
方法,它使用ServiceSecurityContext
找出正在调用的窗口标识,然后尝试在数据库中查找相关的用户帐户。当从使用模拟并需要IIS中的集成安全性的网站调用它时,这工作正常。电话正在使用股票NetPipeBinding
。
我想按如下方式测试服务:
[TestMethod]
public void AutoLoginAsAnonymousFails()
{
using (var anonymousContext = WindowsIdentity.Impersonate(WindowsIdentity.GetAnonymous().Token))
{
ISecurityService securityService = ClientChannelManager.CreateSecurityServiceChannel();
var loginResponse = securityService.AutoLogin();
((ICommunicationObject)securityService).Close();
Assert.IsFalse(loginResponse.IsSuccessful);
}
}
在服务方面,securitycontext中的用户总是我 - 如何使其成为匿名用户?我已经尝试冒充IntPtr.Zero
,但没有成功。
供参考服务方法的相关部分:
public ResponseMessage AutoLogin()
{
if (ServiceSecurityContext.Current.WindowsIdentity != null
&& !ServiceSecurityContext.Current.WindowsIdentity.IsAnonymous
&& !ServiceSecurityContext.Current.WindowsIdentity.IsGuest
&& ServiceSecurityContext.Current.WindowsIdentity.IsAuthenticated)
{
// find the user based on his windows identity and return success = true message
}
// return success = false message
}
答案 0 :(得分:2)
这是关注点分离如何帮助您的典型示例。不要直接依赖ServiceSecurityContext(IMO从不这样做),请确保配置您的服务,以便将安全信息封装在Thread.CurrentPrincipal中。
这将允许您独立于域逻辑改变您的安全问题。如果您坚持使用IPrincipal接口并抵制向WindowsPrincipal进行向下转换的诱惑,您的代码甚至可以为身份的未来做好准备:基于声明的身份,由Windows Identity Foundation(WIF)实现。
这对单元测试也有很大帮助,因为您可以在调用受测系统(SUT)之前将GenericPrincipal分配给Thread.CurrentPrincipal。