wcf中的模拟

wcf中的模拟,wcf,security,windows-authentication,impersonation,Wcf,Security,Windows Authentication,Impersonation,目前,我正在使用一个由Asp.net MVC应用程序使用的WCF服务 出于安全原因,我使用表示用户名和密码的guid。(当用户登录时,WCF检查active directory中的凭据,并在数据库表中创建一条记录,该记录将guid与用户名和密码连接起来) 当用户使用另一个服务时,我会在标头中发送此guid。 我想使用此guid在wcf中模拟用户。 我尝试了以下方法(使用authorizationManager),但没有效果 public class MyAuthBehaviour :Servi

目前,我正在使用一个由Asp.net MVC应用程序使用的WCF服务

出于安全原因,我使用表示用户名和密码的guid。(当用户登录时,WCF检查active directory中的凭据,并在数据库表中创建一条记录,该记录将guid与用户名和密码连接起来) 当用户使用另一个服务时,我会在标头中发送此guid。 我想使用此guid在wcf中模拟用户。 我尝试了以下方法(使用authorizationManager),但没有效果

 public class MyAuthBehaviour :ServiceAuthorizationManager
    {
        public override bool CheckAccess(OperationContext operationContext, ref Message message)
        {

            var index = operationContext.IncomingMessageHeaders.FindHeader("identifier", "");

            if (index >= 0)
            {
                string identifier = operationContext.IncomingMessageHeaders.GetHeader<string>(index);
                AddWindowsID(identifier);
            }           
            return true;
        }

        private void AddWindowsID(string identifier)
        {
            WindowsIdentity wid = AccountBL.GetWindowsIdentity(identifier);
            wid.Impersonate();
        }      
    }
公共类MyAuthBehavior:ServiceAuthorizationManager { 公共覆盖布尔检查访问(OperationContext OperationContext,ref消息) { var index=operationContext.IncomingMessageHeaders.FindHeader(“标识符”,即“”); 如果(索引>=0) { 字符串标识符=operationContext.IncomingMessageHeaders.GetHeader(索引); AddWindowsID(标识符); } 返回true; } 私有void AddWindowsID(字符串标识符) { WindowsIdentity wid=AccountBL.GetWindowsIdentity(标识符); wid.Impersonate(); } } 我确实获得了WindowsIdentity,但我无法模拟。 有办法做到这一点吗

简而言之:我想在WCF中的用户使用标头中的guid进入实际的服务方法之前模拟该用户

当wid.Impersonate()命中时,客户端抛出以下异常:

由于内部错误,服务器无法处理该请求。 有关错误的详细信息,请启用 IncludeExceptionDetailInFaults(来自ServiceBehaviorAttribute 或从中的服务器上的配置行为) 命令将异常信息发送回客户端,或打开 根据Microsoft.NET Framework SDK文档和 检查服务器跟踪日志

WCF继续运行。(尽管WCF服务中存在其他异常)


执行wid.Impersonate()时不会引发异常,它发生在我们离开MyAuthBehavior类时

执行调用wid.Impersonate()时会发生什么?它会引发异常吗?如果是,什么?如果不是,您如何知道“我不能模拟”?添加了一些关于异常的额外信息,这不是基础异常-只是服务调用引发异常时WCF在客户端通道堆栈中创建的一般错误消息。正如消息所说,您应该打开WCF跟踪以查看服务端的真正异常。您是对的。问题不是模仿。早些时候,我在试验messagecontracts。这和我在这里做的不太吻合。当我改变这一点时,模仿很有效。