【发布时间】:2015-11-09 17:52:47
【问题描述】:
我想使用应用程序池凭据来避免来自 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 调用而不指定任何凭据并设置
client.UseDefaultCredentials = true;? -
这篇 SO 帖子有帮助吗? stackoverflow.com/questions/3891260/…
-
UseDefaultCredentials 不起作用。这是来自 MSDN 的文档:“DefaultNetworkCredentials 返回的凭据表示应用程序正在运行的当前安全上下文的身份验证凭据。对于客户端应用程序,这些通常是 Windows 凭据(用户名、密码和域) 运行应用程序的用户。对于 ASP.NET 应用程序,默认网络凭据是登录用户或被模拟用户的用户凭据。"
-
根据我的经验,每次我通过Task.Factory.StartNew创建一个新任务时,该任务都会以应用程序池用户的身份运行。
标签: c# .net security asp.net-web-api