Asp.net core Cookie & Session 작성(인증서비스를 사용하지x)

 

ㆍCookie
기본 쿠키작성하기 (인증 서비스를 이용하지 x, startup.cs 서비스 및 middleware x)
    Controller  작성시 Response , Request 객체를 기본적으로 지원하므로 별도의 서비스 및 미들웨어 추가 없이 쿠키 작성가능
    (컨트롤러 작성시 기본상속되는 Controllers 클래스가 상속받는 ControllerBase 의  Response , Reqeust  메서드 지원함

– 쿠키생성    : Response.Cookies(KEY , VALUE);
– 쿠키사용   :  var myValue = Request.Cookies[KEY];

public class MyPageController: Controllers
{
        public MyPage()
        {
             // 컨트롤러 생성자에서 Response  / Request 객체가 생성되기 전이므로 
             // Response , Request 객체를 사용할수 없으므로 쿠키생성 및 읽기 오류 NullReferenceException
        }

       public void MakeCookie()
       {
               Response.Cookies.Append(“userId”, “Pluginn”);
               string getUserId = Request.Cookies[“userId’];
       }

      public void MakeCookieWithOptions()
      {
             CookieOptions options = new CookieOptions();
             option.Expires = DateTime.Now.AddDays(1)
             option.HttpOnly = true;

           / *   또는, 
              CookieOptions options = new CookieOptions()
               {
                     Expires = DateTime.Now.addDays(1), 
                     HttpOnly = true
               };
           */             

              Response.Cookies(“UserIdOp” , “pluginn” , options);
              string getUserId = Request.Cookies[“UserIdOp’];
      }
}

ㆍSession
기본 세션작성(인증 서비스를 이용하지 x)
   Session 의경우 서비스 및 미들웨어를  추가해줘야한다. (services.addSession() + app.UseSession()) 
   ① services.addSession()  추가  : startup.cs 의  ConfigureServices()  서비스 컨테이터에 services.addSession()  (또는 옵션추가) 추가 
   ② app.UseSession() 추가 : Configure() 미들웨어 파이프라인에 app.UseSession(); 추가

– 세션생성 :  HttpContext.Session.SetString( KEY  ,Value) /  HttpContext.Session.SetInt32( KEY , Value)

                     예) HttpContext.Session.SetString(“UserId”, “pluginn”)
                           HttpContext.Session.SetInt32(“UserDeptNo”, 88);

– 세션사용 : HttpContext.Session.GetString(KEY) / HttpContext.Session.GetInt32(KEY)
                     예) var userId = HttpContext.Session.SetString(“UserId”, “pluginn”)   
                           int userDeptNo = HttpContext.Session.SetInt32(“UserDeptNo”);

public class MyPageController: Controllers
{
        public MyPage()
        {
             // 컨트롤러 생성자에서 Response  / Request 객체가 생성되기 전이므로 
             // Response , Request 객체를 사용할수 없으므로 쿠키생성 및 읽기 오류 NullReferenceException
        }

       public void MakeCookie()
       {
              HttpContext.Session.SetString(“UserId” , “Pluginn”);
              HttpContext.Session.SetInt32(“UserDeptNo”, 88);


              string getUserId =HttpContext.Session.GetString(“UserId”);
              int getUserDeptNo = HttpContext.Session.GetInt32(“UserDeptNo”);

       }
}

ㆍ외부 컴포넌트(DLL) 에서 HttpContext  사용하기 

ㆍMVC 또는 웹 페이지의 경우, 작성되는 웹관련 페이지들은 상속받는 클래스로부터 HttpContext 객체 속성을 사용할수 있기때문에
    Response , Request 를 포함  현재 호출되는 Context 의 여러가지 객체들을 사용할 수가 있다.
     
    하지만 외부 모듈(재사용성, 편의성)로 분리된 DLL 의 경우 특정한 프로젝트에 종속되어 만들어 지지않기 때문에, 웹에서 사용될 DLL 의
    경우 호출되는 웹의 context 를 DLL 에서 사용할수 있게 해줘야  외부DLL 에서도 본인이 호출되어지는 웹페이지에서의 쿠키,세션이나
    기타 Response  , Request 에 대한정보를 독립적으로 다뤄 처리가 가능하다.

     기존에 HttpContext.Current 를 대체해 asp.net Core 에서 사용하는  HttpContextAccessor (예전에는 HttpContext.Current) 는
      ASP.NET Core의 HttpContextAccessor는 비동기 모델을 위해 새롭게 나온 타입 이다.

    외부 DLL 도 HttpContext 를 사용할수 있는 , 웹 관련 클래스를 상속시키는방법
    외부 DLL 객체 참조시 현재 Context 를 파라미터로 전달하는 방법
    외부 DLL 생성자에게 의존성주입을통해 Context 를 전달하는 방법
   

① 외부 DLL –  HttpContext 를 사용할수 있는 , 웹 관련(HttpContextAccessor) 클래스를 상속시키는방법

※ DLL 모듈 (HttpContextAccessor   , Controller , ControllerBase 등 상속)
    public Class MyUtil  : HttpContextAccessor  
    {
           pubilc string getCurrentUser()
           {
                 return string HttpContext.Request.Cookies[“UserID”];
           }
    }

※ DLL 참조하는 웹 프로젝트 메서드
public IActionResult GetInfoFromDLL()
{
     Class.MyClass myclass = new Class.MyClass();
     var info = myclass.getCurrentUser();
     ViewBag.inherit = info;
     return View();
}

② 외부 DLL 객체 참조시 현재 Context 를 파라미터로 전달하는 방법
※ DLL 모듈
    public Class MyUtil 
    {
           pubilc string getCurrentUser(HttpContext context)
           {
                 return string context.Request.Cookies[“UserID”];
           }
    }

※ DLL 참조하는 웹 프로젝트 메서드
public IActionResult GetInfoFromDLL()
{
     Class.MyClass myclass = new Class.MyClass(this.HttpContext);
     var info = myclass.getCurrentUser();
     ViewBag.inherit = info;
     return View();
}

③ 외부 DLL 생성자에게 의존성주입을통해 Context 를 전달하는 방법

– StartUp.cs 에 서비스 컨테이너에서 서비스 등록
  public void ConfigureServices(IServiceCollection services)
  {
       ★ 의존성 주입을 받을 MyUtil 클래스도 의존성 주입을 통해  호출되어야 MyUtil 생성자가 의존성 주입을 받는다.
         MyUtil 클래스에서 생성자가 쿠키/세션사용을 위해 IHttpContextAccessor 주입받으므로, MyUtil 클래스도 주입받아야한다.
         services.AddTransident<UtilClass.MyUtil>();

         ★ MyUtilClass 에서 주입받을 IHttpContextAccessor
         services.AddTransient<IHttpContextAccessor , HttpContextAccessor>();
  }


※ DLL 모듈

    public Class MyUtil 
    {
           private IHttpContextAccessor _contenxt;
         
           public MyClass()
           {
           }

           public MyClass(IHttpContextAccessor context)
           {
                     this._contenxt = context;
           }

          public string getCurrentUserId()
          {
               string cookieInfo = string.Concat(“from DLL DI: “, this._contenxt.HttpContext.Request.Cookies[“myClassuserID”]);
               string sessionInfo = string.Concat(“Ssession UserId “, this._contenxt.HttpContext.Session.GetString(“UserId”));
     
          return string.Concat(cookieInfo, sessionInfo);
          }
  }

※ DLL 참조하는 웹 프로젝트 메서드사용자 클래스
public Class HomeController
{
    private readonly Class.MyClass _myClass; 

    // 
    public HomeController(Class.MyClass myClass)
    {
           this._myClass = myClass;
    }

    public IActionResult GetInfoFromDLL()
    {
         var info = _myClass.getCurrentUser();
         ViewBag.inherit = info;
         return View();
    }
}

 
★ 만약  HomeController 가  IHttpContextAccessor 를 주입받는  myClass 를 주입식이 아닌, 직접 생성자를 통해 받게되면,
  public IActionResult GetInfoFromDLL()
    {   
        var myClass = new myClass();               // 의존성 주입이 일어나지않음 
         var info = _myClass.getCurrentUser();  // 이때 getCurrentuser 의 this._context 는 null reference exception 발생함
         ViewBag.inherit = info;
         return View();
    }

 

 

 

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다