使用App Pool凭据进行WebClient请求

时间:2015-11-09 17:52:47

标签: c# .net security asp.net-web-api

我想使用应用池凭据来避免来自Web API方法的双跳问题。但是,我不希望所有请求都被模拟,只是这一个特定请求。代码目前看起来像这样:

[Route("api/mycontroller/mymethod")]
public string GetDataFromOtherInternalSystem(int id)
{
  var client = new WebClient ( Credentials = CredentialCache.DefaultNetworkCredentials);

return client.DownloadString('http://internaldomain/api/method/id')

}

根据我对MSDN的理解,用户上下文是该浏览器会话的登录用户(即我的帐户通过Active Directory而不是应用程序池的帐户)。

  

DefaultNetworkCredentials返回的凭据代表   当前安全上下文的身份验证凭据   应用程序正在运行。对于客户端应用程序,这些是   通常是Windows凭据(用户名,密码和域)   运行应用程序的用户。对于ASP.NET应用程序,   默认网络凭据是登录的用户凭据   用户或被模仿的用户。

这会产生双跳问题,如果请求作为服务帐户从Web应用程序中干净地出现,则可以消除该问题(无需我即时构建凭据)。

有关如何在没有指定用户凭据的情况下模拟应用程序池的任何想法,如下所示:

var cred = new NetworkCredential("myusername", "mypassword")

我再次试图避免为Kerberos或CORS正确设置其他Web服务。

1 个答案:

答案 0 :(得分:3)

这可以通过将空指针(IntPtr.Zero)传递给WindowsIdentity类的静态Impersonate方法来实现。以下是MSDN document for the Impersonate method

中的描述方式
  

使用userToken值为Zero调用Impersonate(IntPtr)方法相当于调用Win32 RevertToSelf函数。如果当前正在模拟其他用户,则控制将恢复为原始用户。

用法类似于以下内容:

using (var impersonationContext = WindowsIdentity.Impersonate(IntPtr.Zero))
{
    try
    {
        // this code is now using the application pool indentity
    }
    finally
    {
        if (impersonationContext != null)
        {
            impersonationContext.Undo();
        }
    }
}