0

私はSOを含めてウェブを検索していますが、問題に対する最良の解決策を見つけることができませんでした。これらの2つの変数(ユーザーID、ユーザータイプ)は、コントローラthrought使用されているMVCでログインセッション変数を管理する方法

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

Code Snapshot

:私は約15のコントローラを持っているMVCプロジェクトを引き継いでいると、各コントローラクラスは、これらの2行で始まりますアクションメソッド。

これを避けるにはどうすればよいでしょうか?私が見つけた2つのオプションは、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

答えをいただきありがとうございますが、このフィルタはリクエストごとに起動しませんか?例えば、 about、contact、homeなどの認証が不要なページ? –

+0

そのため、承認が不要なコントローラのアクションに[AllowAnonymous]属性を追加できます。 –

関連する問題