从Web服务模拟客户端有哪些优缺点? 其中一个优点是审计,使用模拟审计比如何将身份对象从应用程序传递到Web服务更好?
答案 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;