【发布时间】:2016-10-17 22:35:12
【问题描述】:
我有一个控制台应用程序和一个 Web API 2 项目,它们都在同一台服务器上运行。我已经设置了我的控制台应用程序,以便在模拟域帐户时使用 HttpClient 在我的 Web API 中调用 RESTful 端点。
Console.WriteLine("Setting up impersonator.");
using (new Impersonator(accountUsername, accountDomain, accountPwd))
{
Console.WriteLine("Impersonator set up.");
HttpClientHandler handler = new HttpClientHandler();
handler.UseDefaultCredentials = true;
Console.WriteLine("Executing as: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri(serviceBaseUrl);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.GetAsync("api/resource/3/");
Console.WriteLine(response.ToString());
if (response.IsSuccessStatusCode)
{
result = await response.Content.ReadAsAsync<ResourceType>();
}
}
if (result != null)
{
// Do something...
}
}
我认为实际的端点与这个问题无关,因为 Http 请求从未达到这一点(即使没有任何授权属性)。当我在本地运行这两个项目时,Console App 在调用时是成功的。但是,当我在服务器上运行它时,控制台应用程序会收到未经授权的 401。我在我的 Web API 管道中添加了一些日志记录来记录 HttpContext.Current.User 信息。
protected void Application_BeginRequest()
{
var currentContext = HttpContext.Current;
ILogHelper _logger = new LogHelper("System");
_logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "BeginRequest System Principal Name: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
_logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "BeginRequest Is User Null? " + (currentContext.User == null? "YES":"NO"));
if (currentContext.User != null)
{
_logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "BeginRequest User: " + currentContext.User.Identity.Name);
_logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "BeginRequest User Authenticated: " + currentContext.User.Identity.IsAuthenticated.ToString());
}
}
protected void Application_AuthenticateRequest()
{
var currentContext = HttpContext.Current;
ILogHelper _logger = new LogHelper("System");
_logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthenticateRequest System Principal Name: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
_logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthenticateRequest Is User Null? " + (currentContext.User == null ? "YES" : "NO"));
if (currentContext.User != null)
{
_logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthenticateRequest User: " + currentContext.User.Identity.Name);
_logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthenticateRequest User Authenticated: " + currentContext.User.Identity.IsAuthenticated.ToString());
}
}
protected void Application_AuthorizeRequest()
{
var currentContext = HttpContext.Current;
ILogHelper _logger = new LogHelper("System");
_logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthorizeRequest System Principal Name: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
_logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthorizeRequest Is User Null? " + (currentContext.User == null ? "YES" : "NO"));
if (currentContext.User != null)
{
_logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthorizeRequest User: " + currentContext.User.Identity.Name);
_logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthorizeRequest User Authenticated: " + currentContext.User.Identity.IsAuthenticated.ToString());
}
}
在本地运行时,模拟用户登录到“AuthenticateRequest”和“AuthorizeRequest”。但是,当在服务器上运行时,用户在整个管道中都是空的。
我在 IIS 中启用了 Windows 身份验证和模拟(其他所有功能都已禁用)。我已经为此工作了 40 多个小时,感觉自己没有取得任何进展。对这个问题的任何帮助都会很大!
【问题讨论】:
-
客户端和服务器是否使用相同的端点?你在客户端之前启动服务器吗?连接由 1) 源 IP 2) 目标 IP 3) 端口号组成。您只能有一个连接,所有 3 个项目都相同。所以通常服务器首先启动并使用端口号连接到IPAny地址。然后客户端连接到 PC 的 IP 地址。所以虚拟连接实际上是两个连接。服务器到IPAny,客户端到IP。电脑设置发送到 IP 将被路由到 IPAny。
-
@jdweng 我不确定“客户端和服务器是否都使用相同的端点?”是什么意思。但是要回答您的第二个问题,是的,Web API 在控制台应用发出请求之前正在运行。
-
您的服务器看起来像下面的网页,端口号可以是任何端口号(未被阻止)。如果您在已经运行网页的 PC 上运行服务器,则不能使用默认端口号 8080(您将使用相同的端口号运行两个应用程序)。 msdn.microsoft.com/en-us/library/…
标签: c# authentication asp.net-web-api httpclient impersonation