目前我正在使用Asp.net MVC应用程序使用的WCF服务。
出于安全考虑,我使用代表用户名和密码的guid。 (当用户登录时,WCF检查活动目录中的凭据并在数据库中创建记录,该记录将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();
}
}
我确实获得了WindowsIdentity但我无法模仿。 有没有办法做到这一点?
简而言之:我想在使用标头中的guid获取实际服务方法之前模拟WCF中的用户。
当wid.Impersonate()命中时,客户端会抛出此异常:
由于内部错误,服务器无法处理请求。 有关错误的更多信息,请打开 IncludeExceptionDetailInFaults(来自ServiceBehaviorAttribute 或者来自服务器上的配置行为) 命令将异常信息发送回客户端,或打开 根据Microsoft .NET Framework SDK文档进行跟踪 检查服务器跟踪日志。
WCF继续运行。(尽管WCF服务中已经存在其他异常)
执行wid.Impersonate()时不抛出异常,当我们离开MyAuthBehaviour类时会发生异常