我有3个Web服务,都位于同一台服务器上。
我的客户端呼叫服务A,它冒充客户端呼叫服务B,一切都很顺利。
现在,我想模拟服务B的调用者(这是我的用户名)来调用服务C.当我使用与之前相同的技术时(AllowedImpersonationLevel = Impersonate,user.Impersonate()),用户没有通过服务C相反,服务C将用户视为我在IIS中运行它的用户(这是一个UPN,而不是标准的NETWORK SERVICE帐户)。
我需要做些什么特别的工作才能让它发挥作用?这是代表团问题吗? (我认为这不是委托,因为它们都在同一台服务器上)
非常感谢!
答案 0 :(得分:0)
您可以尝试在服务C上启用ASP.Net兼容性
在Web.cofig
中<system.web>
<identity impersonate="true"/>
<authentication mode="Windows"/>
</system.web>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
在您的服务类
中[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service : IService
{
public string ExecuteRequest(string xmlRequest)
{
IRequestManager requestManager = new RequestManager();
return requestManager.ProcessRequest(xmlRequest);
}
}
答案 1 :(得分:0)
我原本期望必须使用委托,因为你要跨过两次进程边界。你试过TokenImpersonationLevel.Delegation吗?
答案 2 :(得分:0)
您需要在此方案中委派。您需要的配置是ImpersonationLevel.Delegation(在配置或代码中设置)。看一下关于codeplex的WCF安全指南,它是一个非常好的资源。小心实现委托,特别是在生产环境中,要求不仅仅是在配置文件中选择正确的选项。您需要确保连接到的应用程序,例如SQL服务器配置为委派,并且在活动目录等中满足某些基础结构要求,例如服务主体名称(SPN)。