我想使用应用程序池凭据来避免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服务。
这可以通过将空指针(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();
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句