目前,我正在使用 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,但我无法模拟。有没有办法做到这一点?
简而言之:我想在 WCF 使用标头中的 guid 进入实际服务方法之前在 WCF 中模拟用户。
当 wid.Impersonate() 命中时,客户端抛出此异常:
由于内部错误,服务器无法处理请求。有关该错误的更多信息,请在服务器上打开 IncludeExceptionDetailInFaults(来自 ServiceBehaviorAttribute 或来自配置行为)以便将异常信息发送回客户端,或者根据 Microsoft .NET Framework SDK 文档打开跟踪和检查服务器跟踪日志。
WCF 继续运行。(尽管 WCF 服务中存在其他例外情况)
执行 wid.Impersonate() 时不会抛出异常,它发生在我们离开 MyAuthBehaviour 类时