在WCF ServiceLayer中区分本地服务帐户和模拟的客户端标识

时间:2012-07-19 09:44:28

标签: c# .net security wcf-security

我们有一个用MVC编写的Web前端,它使用SSO和Windows身份验证,并且此前端连接到配置为使用特定AD服务帐户运行的后端WCF服务层。

我们喜欢这种方法,因为与数据库服务器的连接是可信的,我们在web.config中没有密码,并且允许WCF服务层连接到SQL Server,因为服务帐户对数据库服务器具有适当的权限,单个最终用户没有,他们不应该。

我现在正在寻找的是一种使WCF服务能够区分哪个用户身份从客户端连接并验证应用程序级别的安全规则(我们使用Visual Guard安全框架)的方法,但同时我们当我们使用EF连接到SQL时,仍然需要使用当前的服务帐户。

到目前为止,我所做的是以下内容,

当我在Web前端创建WCF客户端时:

using (((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate())
{
  var client = new RPPServiceInterface().GetRWSService();
  ...
}

从我将此调用引入上述Impersonate之后,在下面的代码中,我可以检索客户端用户而不是服务帐户:

[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]
public List<RWSProgram> GetCedentsPrograms(int cedentID, int uwYear)
{
  var currentSec = ServiceSecurityContext.Current;
  ...
}

我想要做的是我们用来验证安全性的客户端身份然后以某种方式释放该身份或者有另一种方式冒充服务层中的服务帐户以打开我的SQL连接......任何想法?我做错了什么或误解了整个画面?

P.S。我已经检查了这个,但没有帮助.... WCF service dual impersonation?

谢谢,Davide。

1 个答案:

答案 0 :(得分:1)

这是你在找什么? :

// ...Service operation code impersonating a client here

using (WindowsImpersonationContext processContext = WindowsIdentity.Impersonate(IntPtr.Zero))
{
    // Database access stuff here
    // Within the using block the client is no longer impersonated:
    // context reverts to the identity running the service host process
    // (I'm assuming this is what you call your service account)
}

// Ensuing code impersonates the client as previously...