来自Web服务的客户端模拟?

时间:2011-02-15 16:03:35

标签: .net wcf design-patterns architecture

从Web服务模拟客户端有哪些优缺点? 其中一个优点是审计,使用模拟审计比如何将身份对象从应用程序传递到Web服务更好?

1 个答案:

答案 0 :(得分:2)

模仿的目的是将服务的访问权限扩展到可能不受限制的资源。它通过考虑请求者的权利来做到这一点。当模拟必须确定是否允许访问特定资源时,模拟使服务能够承担请求者的安全上下文。

实现模拟的最简单方法是在服务方法上以声明方式。 OperationBehavior属性包含一个名为Impersonation的属性。此属性可以设置为“必需”或“允许”。

 [OperationBehavior(Impersonation = ImpersonationOption.Allowed)]
public bool Update()
{
return true;
}

如果Impersonation属性设置为Allowed,则客户端凭据可以流向该服务。如果将“模拟”设置为“必需”,则服务必须采用客户端的凭据。

有时候并非所有方法都需要模拟。例如,可能仅在访问文件时才需要模拟。为了实现这一点,可以通过使用WindowsImpersonationContext类来强制实现模拟。

首先,您必须检索与当前请求关联的Windows标识。这可以通过ServiceSecurityContext.Current对象获得。如果WindowsIdentity属性不为null(请记住模拟需要Windows标识),则可以在标识上调用Impersonate方法。以下代码演示了此技术:

 WindowsIdentity callerIdentity =
    ServiceSecurityContext.Current.WindowsIdentity;
    if (callerIdentity == null)
    throw new InvalidOperationException(
    "The caller cannot be mapped to a WindowsIdentity");
    using (WindowsImpersonationContext context = callerIdentity.Impersonate())
    {
        // Access a file as the caller.
    }

到目前为止所展示的两种模仿技术是逐个方法运作的。还可以为服务中的所有方法启用模拟。您可以通过将ServiceAuthorization行为上的ImpersonateCallerForAllOperations属性设置为true来执行此操作。您可以执行此操作,如以下代码示例所示:

ServiceHost serviceHost = new ServiceHost(typeof(TestService));
ServiceAuthorizationBehavior behavior =
serviceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>();
behavior.ImpersonateCallerForAllOperations = true;