asp.net webapi Windows身份验证在模拟呼叫中获取用户名

时间:2018-08-14 13:19:12

标签: c# asp.net asp.net-mvc windows-authentication impersonation

由于某种原因,我无法在模拟呼叫中获取Windows用户名。 我遵循了答案 here,但没有得到相同的结果。

在服务器A上,我有一个intranett ASP.MVC应用程序,在IIS中只有Windows身份验证。 IIS server A

在服务器A上mvc应用程序的Web配置中,我使用模拟。

Web.config, server A

用于调用Web API的代码

var impersonationContext = WindowsIdentity.GetCurrent().Impersonate();
using (impersonationContext)
{
   var client = GetHttpClient();
   return await client.PostAsync("services/ExecuteCommand/Execute", httpContent);
}
private HttpClient GetHttpClient()
{
   var httpClientHandler = new HttpClientHandler
   {
      UseDefaultCredentials = _commandServiceUseDefaultCredentials
   };
   var client = new HttpClient(httpClientHandler)
   {
      BaseAddress = new Uri(ConfigurationManager.AppSettings["CommandServiceBaseUrl"].ToString()),
   };
   client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));       
   return client;
}

在服务器B上,我有一个具有Windows身份验证的ASP.Net Web API(核心)项目

IIS server B

在服务器B上的Web api的Web配置中,使用Windows身份验证进行指定,但不能模拟。

Web.config, server B

我正在尝试为浏览我的mvc应用程序的用户获取Windows用户名。我已经尝试了很多,所以最终还是用这种方法把它们都弄了。

private string GetUserName()
{
   var windowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent();
   System.Security.Principal.WindowsIdentity windowsIdentity2 = null;
   if (System.ServiceModel.OperationContext.Current != null)
      if (System.ServiceModel.OperationContext.Current.ServiceSecurityContext != null)
         windowsIdentity2 = System.ServiceModel.OperationContext.Current.ServiceSecurityContext.WindowsIdentity;

   var httpContextIdentity = System.Web.HttpContext.Current.User.Identity;
   return string.Format("{0}_{1}_{2}_{3}_{4}",
                System.Environment.UserName ?? "",
                User.Identity.Name,
                windowsIdentity != null ? windowsIdentity.Name : string.Empty,
                windowsIdentity2 != null ? windowsIdentity2.Name : string.Empty,
                httpContextIdentity != null ? httpContextIdentity.Name : string.Empty);
}

这产生了这个结果

  

System.Environment.UserName:不带域的ServerB App_pool用户

     

User.Identity.Name:域\ ServerA $

     

System.Security.Principal.WindowsIdentity.GetCurrent()。名称:ServerB   域\ app_pool用户

     

System.ServiceModel.OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name:   (空)

     

System.Web.HttpContext.Current.User.Identity:Domain \ ServerA $

那么我如何获得我的mvc应用程序最终用户的Windows用户名?

0 个答案:

没有答案