레이블이 Authorization인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Authorization인 게시물을 표시합니다. 모든 게시물 표시

2023년 12월 18일 월요일

c# - BaseController (Authorization)

 

로그인을 해야지만 접속이 가능한 Controller에 상속한 BaseController를 만든다. 

 

1. BaseController.cs

    public class BaseController : Controller
    {
        public string actionName { get; protected set; }
        public string controllerName { get; protected set; }

        protected override void OnActionExecuting(ActionExecutingContext filter)
        {
            
            //로그인 체크
            LogonCheck(filter);

			//DoNotAuthorizeAttribute가 설정되어 있으면 접속권한 체크하지 않는다. 
            if (filter.ActionDescriptor.GetCustomAttributes(true).Any(x => x is DoNotAuthorizeAttribute))
            {
                return;
            }

			//Ajax 호출은 접속권한 체크하지 않는다. 
            if (filter.HttpContext.Request.IsAjaxRequest())
            {
                return;
            }

            //메뉴 권한체크 추가 
            CheckAccessAuth(filter);
        }

        private void LogonCheck(ActionExecutingContext filter)
        {

            if (!isLogin) //session or cookie로 로그인 여부 확인
            {

                var routeDictionary = new RouteValueDictionary { { "action", "Logout" }, { "controller", "Account" } };
                //강제 로그아웃 시킨다. 
                filter.Result = new RedirectToRouteResult(routeDictionary);

                return;
            }
        }

        private void CheckAccessAuth(ActionExecutingContext filter)
        {
            //컨트롤러, 액션
            actionName = filter.ActionDescriptor.ActionName;
            controllerName = filter.ActionDescriptor.ControllerDescriptor.ControllerName;
			
            //로그인 계정정보, controller, action 정보로 접속권한 db 체크 
            if (!CanAccessMenu(loginInfo, controllerName, actionName)) {

                //권한없을 경우는 로그인 말고 다른페이지로 이동
                var routeDictionary = new RouteValueDictionary() { { "action", "NotAuthorized" }, { "controller", "Account" } };
                filter.Result = new RedirectToRouteResult(routeDictionary);
                return;
            }
        }
    }

 

2. 권한체크 필요한 Controller에서 BaseController 상속받는다. 

 

    public class NoticeController : BaseController
    {
    
    }

 

출처 : https://bigexecution.tistory.com/78


2022년 12월 5일 월요일

C# - 클래스, 함수, 권한 등 사용 예문

 
//-----------------------------------------------
        [AllowAnonymous]
        public ActionResult 함수_페이지(string reftype = null)
        {
            return View(new Tuple<클래스타입1, 클래스타입2[], 클래스타입3[], 클래스타입4[]>(객체1, 객체2, 객체3, 객체4));
        }
        @using Model.Common
        @model Tuple<클래스타입1, 클래스타입2[], 클래스타입3[], 클래스타입4[]>


//-----------------------------------------------
        [AllowAnonymous, ChildActionOnly]
        public PartialViewResult 함수_Partial()
        {
            return PartialView(new Tuple<Banner>(adBanner));
        }
        @using Model.Common
        @model Tuple<Banner>


        @Html.Action("함수_Partial", "Main")


//-----------------------------------------------
        [HttpPost]
        public JsonResult 함수_기능(int Idx)
        {
            //return Json(new {객체1, 객체2});
            return Json(객체);
        }


//-----------------------------------------------
        [NonAction]
        private object 함수_기능()
        {
            return list.Select(x => new
            {
                PROD_NUM = x.PROD_NUM,
                IDX = x.IDX
            });
        }


//-----------------------------------------------
[FilterConfig.cs]
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class UserAuthorizationAttribute : FilterAttribute, IAuthorizationFilter
    {
        public RoleType Role { get; set; }
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            if ((Role & RoleType.Wos) == RoleType.Wos)
            {
                if (!전역_객체.IsWos) // Wos가 아니면
                {
                    throw new Exception("Wos 권한이 없습니다.");
                }
            }
        }
    }

    [Flags]
    public enum RoleType
    {
        Wos
    }


[View1.cs]
        [UserAuthorization(Role = RoleType.Wos)]
        public ActionResult WosCart(string cList)
        {
            ViewBag.Name = Common.객체1.Name;
            return View(Json(cList));
        }


//-----------------------------------------------
        private Dictionary<string, string> GetParameterResultMap(string parameter)
        {
            // + 기호가 공백으로 넘어 오는경우 처리
            string decString = parameter.Replace(" ","+");
            Dictionary<string, string> resultMap = parseStringToMap(decString);
            return resultMap;
        }

        public static System.Collections.Generic.Dictionary<string, string> parseStringToMap(string text)
        {
            System.Collections.Generic.Dictionary<string, string> retMap = new System.Collections.Generic.Dictionary<string, string>();
            if (string.IsNullOrEmpty(text) || string.IsNullOrWhiteSpace(text))
                return retMap;
            string[] arText = text.Split('&');
            for (int i = 0; i < arText.Length; i++)
            {
                string[] arKeyVal = arText[i].Split('=');
                retMap.Add(arKeyVal[0], arKeyVal[1]);
            }
            return retMap;
        }


//-----------------------------------------------
    public enum CancelState : int
    {
        [Description("취소요청")]
        RequestCancel = 0,
        [Description("취소대기")]
        ProcessingCancel = 1,
        [Description("취소불가")]
        ImpossibleCancel = 2,
        [Description("취소완료")]
        CompleteCancel = 3
    }


//-----------------------------------------------
    public class InicisRequest
    {
        #region 기본 데이터 필드
        [Required]
        [StringLength(20)]
        public string version { get; set; }
        [Required]
        [StringLength(10)]
        public string mid { get; set; }
        [Required]
        public int price { get; set; }
        public int tax { get; set; }
        :
        #endregion
    }


MSSQL - Cursor vs Temp Table

#테이블 변수사용의 예 use pubs go declare @tmptable table (     nid int identity(1,1) not null,     title varchar (80) not null ) -- 테이블 변수 선언 inse...