0

SO를 포함하여 웹을 검색했지만 문제에 대한 최상의 해결책을 찾을 수 없습니다. 나는이 2 명 선으로 ​​약 15 컨트롤러가있는 MVC 프로젝트를 인수하고 각 컨트롤러 클래스는 시작했다 :MVC에서 로그인 세션 변수를 관리하는 방법

int userid = (int)System.Web.HttpContext.Current.Session["UserID"]; string usertype = (string)System.Web.HttpContext.Current.Session["UserType"];

Code Snapshot

이 두 변수 (사용자 ID, 유저 유형은) 다음 컨트롤러 throught를 사용하는 액션 메소드.

이 문제를 방지하는 가장 좋은 방법은 무엇입니까? 내가 찾은 두 가지 옵션은 SessionEndAttribute 클래스를 생성하여 각 컨트롤러에 추가하거나 세션 검사로 기본 컨트롤러 클래스를 만들고 모든 컨트롤러 클래스를 BaseController 클래스에서 상속 받도록 만드는 것입니다.

이 나는 ​​순간 한 일이다, 이것은 올바른 방법 인 경우 알려

컨트롤러 :

[SessionExpire] 
public class WordShareController : Controller 
{ 

    int userid = 0; 
    string usertype = string.Empty; 

    public WordShareController() : this(new SessionManagement()) 
    { 

    } 
    public WordShareController(SessionManagement objSession) 
    { 
     userid = objSession.UserId; 
     usertype = objSession.UserType; 

    } 

SessionManagement.cs

public class SessionManagement 
{ 
    private int _userId = 0; 
    private String _userType, _userName, _webName = string.Empty; 

    public SessionManagement() 
    { 
     if (HttpContext.Current.Session["UserID"] != null) 
     { 
      _userId = Convert.ToInt32(HttpContext.Current.Session["UserID"]); 
      _userType = Convert.ToString(HttpContext.Current.Session["UserType"]); 
      _userName = Convert.ToString(HttpContext.Current.Session["UserName"]); 
      _webName = Convert.ToString(HttpContext.Current.Session["WebName"]); 
     } 
    } 

    public int UserId 
    { 
     get 
     { 
      return _userId; 
     } 
    } 
    public string UserType 
    { 
     get 
     { 
      return _userType; 
     } 
    } 
    public string UserName 
    { 
     get 
     { 
      return _userName; 
     } 
    } 
    public string WebName 
    { 
     get 
     { 
      return _webName; 
     } 
    } 

} 

SessionExpireAttribute.cs

public class SessionExpireAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpSessionStateBase session = filterContext.HttpContext.Session; 
     // If the browser session or authentication session has expired... 
     if (session.IsNewSession || session["LoginUser"] == null) 
     { 
      if (filterContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       // For AJAX requests, return result as a simple string, 
       // and inform calling JavaScript code that a user should be redirected. 
       JsonResult result = new JsonResult() 
       { 
        Data = "SessionTimeout", 
        ContentType = "text/html" 
       }; 
       filterContext.Result = result; 
      } 
      else 
      { 
       // For round-trip requests, 
       filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary { 
      { "Controller", "User" }, 
      { "Action", "Login" } 
       }); 
      } 
     } 
     base.OnActionExecuting(filterContext); 
    } 
} 
+0

처럼이 인증합니다 클래스를 등록하는 것이인가 갈 올바른 방법? 누구? –

답변

0

다른 방법으로 별도의 클래스를 만들고 mvc AuthorizeAttribute 클래스를 구현할 수 있습니다. 그럼 당신은 App_Start이 클래스를 등록 할 수 있습니다 -> FiletrConfig.cs

코드는 다음과 같을 것이다 :

public class Authenticate : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(System.Web.HttpContextBase httpcontext) 
    { 
     //your authentication code from session or query string 
    } 
} 

FilterConfig.cs에서이

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new Authenticate()); 
    } 
} 
+0

답을 고맙지 만 각 요청에 대해이 필터가 작동하지 않습니까? 예를 들어 연락처, 인증이 필요없는 집과 같은 페이지입니까? –

+0

그 때문에 권한 부여가 필요없는 컨트롤러 동작에 [AllowAnonymous] 특성을 추가 할 수 있습니다. –