我想使用应用池凭据来避免来自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服务。
答案 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();
}
}
}