对WebClient请求使用应用程序池凭据

本文关键字:应用程序 程序池 应用 WebClient 请求 | 更新日期: 2023-09-27 18:21:24

我想使用应用程序池凭据来避免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服务。

对WebClient请求使用应用程序池凭据

这可以通过将空指针(IntPtr.Zero)传递到WindowsIdentity类的静态Impersonate方法来实现。以下是MSDN文档中对Impersonate方法的描述:

调用userToken值为零的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();
        }
    }
}