首页 文章

Asp net Core获取用户Windows用户名

提问于
浏览
1

在ASP .net CORE mvc中构建一个Intranet,我需要获取当前用户的Windows用户名进行登录,我不需要使用Windows身份验证自动登录用户,我已经有一个自定义登录控制器来做到这一点,我只需要他的用户名 .
它在本地工作正常,但我无法在IIS服务器上获取用户名:
Local :

Environment.UserName => VeronY 
System.Security.Principal.WindowsIdentity.GetCurrent().Name => Domain\VeronY

IIS server :

Environment.UserName => Intranet
System.Security.Principal.WindowsIdentity.GetCurrent().Name => APPPOOL\Intranet

使用Windows Auhtentication,它会自动登录我,这不是我需要的 . 必须有两种类型的身份验证:通过Identity Framework自动使用AD和手动进行表单管理 .

1 回答

  • 1

    ASP .net似乎没有授权2种不同类型的连接,所以我让主站点进行了表单身份验证,我创建了一个小API:

    [Authorize]
    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        [HttpGet]
        public ActionResult Get()
        {
            return Json(User.Identity.Name);
        }
    }
    

    配置Windows身份验证 .
    这是主网站中的LoginController:

    String responseString = "";
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://myapiURL");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                var response = client.GetAsync("api/values").Result;
                if (response.IsSuccessStatusCode)
                {
                    responseString = response.Content.ReadAsStringAsync().Result;
                    responseString = Regex.Unescape(responseString).Replace("\"","");//Because the response is something like \\"Domaine\\\\Username\"\
                }
                else
                {
                    return View();//server cannot be found or Windows authentication fail => form Login
                }
            }
            String username = "";
            String domain = "";
    
            if (responseString != "" && responseString.Contains("\\"))
            {
                domain = responseString.Split('\\')[0];
                username = responseString.Split("\\")[1];
                if(domain !="MYDOMAIN")
                {
                    return View();//Not in the correct domain => form Login
                }
            }
            else
            {
                return View();//Not the correct response => form Login
            }
            UserPrincipal user = UserPrincipal.FindByIdentity(new PrincipalContext(ContextType.Domain), username);
    
    
            if (null != user)
            {
                CustomAutomaticLogin(user)//All seems ok, try to log the user with custom login with AD informations
            }
            else
            {
               return View()//Not in AD => form login
            }
    }
    

相关问题