2

私はAuthorizeAttributeを使用して、ユーザーがページにアクセスするために設定された18歳以上のCookieを持っていることを確認しています。セッションがMVC AuthorizeAttributeでnullになる

これはうまくいきますが、私は少し前に拡張しています。 すべてのビューはこの属性を使用しているため、私はサイトを早期に立ち上げることができます。 useがVIEWSITE = trueを任意のURLに追加すると、Session変数が設定され、サイトにアクセスできるようになります。それ以外の場合は、保持ページに移動します。

これはページが初めて実行されるときに正常に動作します。しかし、私はページ上で出力キャッシュを使用しています。次回のページロード時に、httpcontext.sessionはnullですか?

私は、彼らが正しい順序で実行することを確認するために私の属性に「注文」varibleを追加しました:

[OfAge(Order = 1)] 
    [OutputCache(Order = 2, Duration = 2000, VaryByParam = "categoryName")] 

Snipitを自分の属性から:

 protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     HttpRequestBase req = httpContext.Request; 
     HttpResponseBase res = httpContext.Response; 


     DateTime Live_Date = new DateTime(2011, 07, 01, 07, 0, 0); 

     if (DateTime.Now > Live_Date || req.QueryString["VIEWSITE"] != null || httpContext.Session["VIEWSITE"] != null) 
     { 
      httpContext.Session["VIEWSITE"] = true; 

は、私が行方不明です何かがありますページがキャッシュから読み込まれると、セッション変数を読み込み/設定できるようになりましたか?

明確にするために、それがnullではなく、特にhttpContext.Session [「VIEWSITE」]

答えて

1

3年ラインの下、私は同様の問題に遭遇したことhttpContext.Sessionです。今私はエキスパートではありませんが、各コントローラのコンテキスト呼び出しはそれ自身の空間で一意であると信じているので、httpContext.Sessionは新しい呼び出しでnullになります。

私の問題は、セッション変数に(彼のカスタムアプリケーションの権限で)保存したかったログインしたADユーザーの形で来ました。私もAuthorizationAttributeを拡張していますが、このフィルタをコントローラアクションに適用すると、ユーザーが保存されていてもhttpContextはnullになります。

同じ問題を抱えている人にとっては、このユーザーとそのセッションの状態が他のコントローラ(ベースコントローラを継承している)全体に保持されるベースコントローラを作成する方法があります。

ex。

マイモデル:

public class LoggedInUser 
    { 
     public somenamespace.userclass UserProfile { get; set; } 
     public List<somenamespace.user_permission_class> UserPermissions { get; set; } 
    } 

マイベースコントローラ:

public class ControllerBase : Controller 
    { 
     private LoggedInUser _LoginUser; 

     public LoggedInUser LoginUser 
     { 
      get 
      { 
       if (_LoginUser != null) 
        return _LoginUser; 

       if (Session["_LoginUser"] == null) 
        return null; 

       return Session["_LoginUser"] as LoggedInUser; 
      } 
      set 
      { 
       _LoginUser = value; 
       Session["_LoginUser"] = _LoginUser; 
      } 
     } 

     public void PerformUserSetup(string sUsername) // sUsername for testing another user, otherwise User.Identity will be used. 
     { 
      sUsername = string.IsNullOrEmpty(sUsername) ? User.Identity.Name : sUsername; 
      sUsername = (sUsername.IndexOf("\\") > 0) ? sUsername.Split('\\').ToArray()[1] : sUsername; 

      // Todo - SQL conversion to stored procedure 
      List<userclass> tmpUser = Root.Query<userclass>(/*sql to select user*/).ToList(); 

      List<user_permission_class> tmpUserpermissions = Root.Query<user_permission_class>(/*sql to select user permissions*/).ToList(); 

      LoggedInUser _LoginUser = new LoggedInUser(); 
      _LoginUser.UserProfile = tmpUser.First(); 
      _LoginUser.UserPermissions = tmpUserpermissions; 

      LoginUser = _LoginUser; 
     } 

    } 

私にHomeController(任意のMVCの例の標準):私は「

public class HomeController : ControllerBase 
    { 
     [Authorize] // Standard AuthorizeAttribute (AD test) 
     public ActionResult Index() 
     { 
      if (Session["_LoginUser"] == null) 
       PerformUserSetup(""); 

      return View(); 
     } 
    } 

マイカスタム許可チェックフィルタ他のコントローラのアクションで使用します:

public class PermissionAuthorize : AuthorizeAttribute 
    { 
     private readonly string[] permissions; 
     public PermissionAuthorize(params string[] perms) 
     { 
      this.permissions = perms; 
     } 

     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
      bool auth = false; 

      if (httpContext.Session["_LoginUser"] == null) 
      { 
       // Do nothing as auth is false. 
      } 
      else 
      { 
       // Check permissions and set auth = true if permission is valid. 
       auth = true; 
      } 

      return auth; 
     } 

     /* not using 
     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      var tmp = filterContext.HttpContext.Session; 
     } 
     */ 
     protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
     { 
      // Todo - direct to "unauth page" 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 

使用法:これに加えて

public class Some_OtherController : /*PossibleNamespace?.*/ControllerBase 
    { 

     [PermissionAuthorize("somepermission")] // This was a CRUD application thus 1 permission per actionresult 
     public ActionResult ViewWhatever() 
     { 
      .... 
     } 
    } 
+0

、また私を助け何かがこの記事でした。http://stackoverflow.com/questions/5447611/why-are-there-two-incompatible- session-state-types-in-asp-net。 HttpSessionStateBase(wrapper)とSystem.Web.SessionState.HttpSessionState(asp.net 1の日の基底コア)にMVCセマンティクスを追加しました。 – KDT

関連する問題