2

웹 응용 프로그램 ASP.NET MVC가 있습니다. 4. 사용자가 응용 프로그램에 로그인하면 세션에 자신의 정보를 UserCtx 클래스의 객체로 씁니다. 이전에, 내가 쿠키를 만들 :세션 객체가 ASP.NET MVC 4에서 잠시 후 null입니다.

public class UserCtx 
{ 
    public static UserCtx UserLogged 
    { 
     get 
     { 
      UserCtx userCtx = ((UserCtx)HttpContext.Current.Session["UserCtx"]); 
      return userCtx; 
     } 
    } 

}

:

public ActionResult executeLogin(LoginModel model) 
{ 
     if (ModelState.IsValid) 
      { 
       FormsAuthentication.SetAuthCookie(model.UserName, false); 

       UserCtx userCtx = ds.SetUserCtx(model.UserName, model.Password); 
       Session["UserCtx"] = userCtx; 
       return Redirect(returnUrl ?? "/Offer"); 
      } 
     else 
      { 
       return View("Index"); 
      } 
    } 

가 쉽게 세션에서 개최 객체에서 작동 할 수 있도록하기를, 내가 응용 프로그램에서 사용하는 정적 속성을 생성

예를 들어 나는 종종보기에이 속성을 사용 : 약간의 시간 후, 일

@if (UserCtx.UserLogged.ADMIN) 
{ 
    @Html.Partial("_gvNetLogPartial") 
} 

그러나 변수가 null 인 것은 사실이지만 왜 이런 일이 발생하는지 알지 못합니다. 또한 web.config에서 시간 제한을 설정했습니다.

또한 세션의 값을 확인하는 모든 컨트롤러에 필터가 있습니다. 다음은 필터입니다.

public class CheckSessionFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.RequestContext.HttpContext.Session["UserCtx"] == null) 
     { 
      FormsAuthentication.RedirectToLoginPage(); 
     } 
    } 
} 

정적 속성을 사용하기 때문에이 오류가 나타날 수 있습니다.

답변

0

최근에 나는 현재 로그인 한 사용자에 대한 정보를 코드처럼 정확하게 "정적"Session 개체에 저장 한 Web .NET 응용 프로그램을 개발했습니다.

그러나 이전 ASP에서 사용한 구식 접근 방식이라는 것을 알고있었습니다. 이제 ASP.NET은 사용자 개체를 처리하는 더 좋은 방법을 제공합니다.

Session 개체를 사용하는 대신 표준 User 개체를 HttpContext 개체로 다시 정의해야합니다. 나는이 접근 방식에 따라 코드를 대체했으며 완벽하게 작동합니다.

아래에서 필자가 수행 한 단계를 요약하면 다음과 같습니다.

먼저 사용자에 대해 필요한 정보를 저장할 클래스를 작성해야합니다. 이 내 꺼야. 사용자가 로그인, 당신은 이전 단계에서 정의 된 사용자 정의 형식의 개체와 현재 HttpContextUser 객체를 교체하는 것이 후 (매우 참조하도록

public interface ICustomPrincipal : IPrincipal 
{ 
    string Email { get; set; } 
    string[] Roles { get; set; } 
    int[] SalesmenId { get; set; } 
    bool HasWritePermission { get; set; } 
} 

public class CustomPrincipalSerializeModel 
{ 
    public string Email { get; set; } 
    public string[] Roles { get; set; } 
    public int[] SalesmenId { get; set; } 
    public bool HasWritePermission { get; set; } 
} 

public class CustomPrincipal : ICustomPrincipal 
{ 
    private IPrincipal principal; 

    public CustomPrincipal(IPrincipal principal, WindowsIdentity identity) 
    { 
     this.Identity = identity; 
     this.principal = principal; 
    } 

    public IIdentity Identity { get; private set; } 

    public bool IsInRole(string role) 
    { 
     //return (principal.IsInRole(role)); 
     if (Roles == null) 
      return false; 
     return Roles.Contains(role); 
    } 

    public string Email { get; set; } 

    public string[] Roles { get; set; } 

    public int[] SalesmenId { get; set; } 

    public bool HasWritePermission { get; set; } 
} 

는 다음, Global.asax에 편집 마지막 명령).

protected void WindowsAuthentication_OnAuthenticate(Object source, WindowsAuthenticationEventArgs e) 
    { 
     if (e.Identity.IsAuthenticated && null == Request.Cookies.Get(CookieName)) 
     { 
      CustomPrincipalSerializeModel cp = new CustomPrincipalSerializeModel(); 

      string username = e.Identity.Name; 

      [...] 

      // Set the data of the current user 
      cp.Roles = [...]; 
      cp.SalesmenId = [...]; 
      cp.Email = [...]; 
      cp.HasWritePermission = [...]; 

      [...] 

      // Serialize the cookie 
      JavaScriptSerializer jss = new JavaScriptSerializer(); 
      string userData = jss.Serialize(cp); 
      FormsAuthenticationTicket formsAuthTicket = 
       new FormsAuthenticationTicket(
          1, 
          username, 
          DateTime.Now, 
          DateTime.Now.AddHours(10), // The cookie will expire in 10 hours 
          false, 
          userData); 
      var encryptedTicket = FormsAuthentication.Encrypt(formsAuthTicket); 

      // Store the cookie 
      HttpCookie httpCookie = new HttpCookie(CookieName, encryptedTicket); 
      Response.Cookies.Add(httpCookie); 
     } 
    } 

    protected void Application_PostAuthenticateRequest(Object sender, EventArgs e) 
    { 
     CustomPrincipal newUser = new CustomPrincipal(User, (WindowsIdentity)User.Identity); 

     HttpCookie authCookie = Context.Request.Cookies.Get(CookieName); 

     if (authCookie != null) 
     { 
      FormsAuthenticationTicket formsAuthenticationTicket = FormsAuthentication.Decrypt(authCookie.Value); 

      JavaScriptSerializer jss = new JavaScriptSerializer(); 

      CustomPrincipalSerializeModel ret = jss.Deserialize<CustomPrincipalSerializeModel>(formsAuthenticationTicket.UserData); 
      newUser.Email = ret.Email; 
      newUser.Roles = ret.Roles; 
      newUser.SalesmenId = ret.SalesmenId; 
      newUser.HasWritePermission = ret.HasWritePermission; 
     } 
     else 
     { 
      newUser.Email = null; 
      newUser.Roles = null; 
      newUser.SalesmenId = null; 
      newUser.HasWritePermission = false; 
     } 

     Context.User = Thread.CurrentPrincipal = newUser; 
    }