2016-04-08 49 views
0

我有一个Web应用程序正在根据需要调用带有模拟的WCF方法。在这种方法中,我需要调用返回安全组的另一个Web服务(ASMX)。问题是,在将Impersonation设置为Required的情况下,当我尝试创建ASMX服务的实例时出现错误。WCF模拟错误调用ASMX

WCF服务方法

[OperationBehavior(Impersonation = ImpersonationOption.Required)] 
public List<MacroTypeInfo> GetFilteredMacroDataTypes(MacroDataTypeSection section) 
{ 

    // Errors out here 
    using (var login = new local.intranet.webservices.login()) 
    { 
     login.getSecurityGroupsForUser(); // Never gets to this line 
    }  

} 

我得到的错误是

Either a required impersonation level was not provided, or the provided  
impersonation level is invalid. (Exception from HRESULT: 0x80070542) 

有没有别的东西,我必须这样做才能够调用这个Web服务内部这种模拟所需的方法?一旦我删除了OperationBehavior属性,该调用就起作用。

+0

FWIW你应该**永远不会***使用冒名顶替,因为*任何*原因。 –

+0

你可以扩展这个想法吗? – user3726393

+0

冒充字面上是认证和授权最糟糕的解决方案。即使您希望允许通过Active Directory服务器进行集中管理,您也不应该使用模拟,您应该将API作为API对AD服务器进行身份验证和授权 –

回答

1

除非获得许可,否则服务器无法将客户端模拟为远程服务器。您可以阅读关于不同级别的假冒的信息here

如果需要此类假冒,客户必须明确允许假冒等级为Delegation

您可以用下面的终结点行为配置WCF客户端实现这一点:如果您使用的是生成的代理,你可以对代理设置此值

<endpointBehaviors> 
    <behavior name="delegateIdentity"> 
     <clientCredentials> 
     <windows allowedImpersonationLevel="Delegation"/> 
     </clientCredentials> 
    </behavior> 
</endpointBehaviors> 

client.ChannelFactory.Credentials.Windows.AllowedImpersonationLevel = 
    System.Security.Principal.TokenImpersonationLevel.Delegation; 

最后,如果您使用ChannelFactory<T>创建了代理服务器,则可以在ChannelFactory<T>上设置与上面相同的值。

+0

有没有办法忽略该通话的模拟? – user3726393

+0

如果您拥有登录服务的控制权,您可以将其更改为允许呼叫者检索任何用户的安全组。 –