Microsoft .NET/ASP.Net & ASP.Net Core

[ASP.Net Core] 접속자 IP 받기

전자기린 2021. 7. 16. 14:35

"Startup.cs" 클래스의 "ConfigureServices 함수"에 아래 코드 추가

        public void ConfigureServices(IServiceCollection services)
        {
            #region IP
            services.AddSingleton<Microsoft.AspNetCore.Http.IHttpContextAccessor, Microsoft.AspNetCore.Http.HttpContextAccessor>();
            #endregion

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

 

IP를 받을 Controller에 아래 코드를 추가하고 생성자 명을 본인 코드에 맞게 변경합니다.

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="_acc"></param>
        public UserController(Microsoft.AspNetCore.Http.IHttpContextAccessor _acc) 
        { 
            HttpContextAccessor = _acc; 
        }

        #region IP
        private Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor;

        /// <summary>
        /// 접속자 IP 주소
        /// </summary>
        public string IP
        {
            get
            {
                var result = string.Empty;
                //헤더에서 IP 주소 가져오기
                if (HttpContextAccessor.HttpContext.Request.Headers != null)
                {
                    //XFF(X-Forwarded-For) HTTP 헤더 필드는 클라이언트의 원래 IP 주소를 식별하기 위한 표준
                    //HTTP 프록시 또는 로드 밸런서를 통해 웹 서버에 연결

                    var forwardedHeader = HttpContextAccessor.HttpContext.Request.Headers["X-Forwarded-For"];
                    if (!Microsoft.Extensions.Primitives.StringValues.IsNullOrEmpty(forwardedHeader))
                        result = forwardedHeader.FirstOrDefault();
                }

                //헤더가 없는 경우 연결 원격 IP 주소를 가져오기
                if (string.IsNullOrEmpty(result) && HttpContextAccessor.HttpContext.Connection.RemoteIpAddress != null)
                    result = HttpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString();

                return result.Replace("::1", "192.168.0.1").Replace("::ffff:", "");
            }
        }
        #endregion