如何从单元测试中调用WCF服务作为匿名身份?

时间:2009-11-05 11:27:36

标签: c# wcf unit-testing impersonation

我有一个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
}

1 个答案:

答案 0 :(得分:2)

这是关注点分离如何帮助您的典型示例。不要直接依赖ServiceSecurityContext(IMO从不这样做),请确保配置您的服务,以便将安全信息封装在Thread.CurrentPrincipal中。

IIRC,当您使用Windows身份验证和模拟时,它甚至可以自动为您设置,但是,您可以随时编写自定义ServiceAuthorizationManager,为您执行此操作。

这将允许您独立于域逻辑改变您的安全问题。如果您坚持使用IPrincipal接口并抵制向WindowsPrincipal进行向下转换的诱惑,您的代码甚至可以为身份的未来做好准备:基于声明的身份,由Windows Identity Foundation(WIF)实现。

这对单元测试也有很大帮助,因为您可以在调用受测系统(SUT)之前将GenericPrincipal分配给Thread.CurrentPrincipal。