2011-08-17 140 views

回答

15

您可以通過3種方式做到這一點:

  1. 創建一個過濾器,你的行動,並將其應用編程OnActionExecuting代碼(之前已經執行的動作),http://www.asp.net/mvc/tutorials/understanding-action-filters-cs

  2. 創建基礎類(從Controller類繼承),並讓你的控制器繼承這個。在這個類中,您可以覆蓋一個名爲OnActionExecuting的方法,就像過濾器一樣。

  3. 不使用會話認證,則可以使用窗體身份驗證,並保持它使用簡單,看看這個:http://weblogs.asp.net/fredriknormen/archive/2008/02/07/asp-net-mvc-framework-using-forms-authentication.aspx

在我看來,解決方案3優於其他。我希望這個對你有用!

+6

解決方案3是錯誤的。使用表單身份驗證,用戶仍然可以通過cookie進行身份驗證,但有一個全新的會話。如果你的控制器沒有捕獲到這個,那麼你可能會有異常,試圖訪問尚未由登錄頁面配置的會話對象。 – 2013-05-27 18:48:53

+0

解決方案1在技術上不正確。雖然有一個過濾器,一個使用來自`AuthorizeAttribute`和`IAuthorizationFilter`,然後根據情況重寫`OnAuthorization`和/或`AuthorizeCore`。這是一直回到MVC 2的情況。 – 2015-02-16 02:32:21

7

因爲可以複製Forms-Authentication的安全性cookie使用它來模擬註冊用戶我使用以下屬性將認證綁定到當前會話生存期。

要使屬性工作,您必須在登錄時設置會話[「user」] = MyUser,並在註銷時調用session.abandom()。 我不知道重定向是否適用於ajax調用 - 這是你必須嘗試的。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public class CheckUserSessionAttribute : ActionFilterAttribute 
{ 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpSessionStateBase session = filterContext.HttpContext.Session; 
     var user = session["User"]; 

     if (((user == null) && (!session.IsNewSession)) || (session.IsNewSession)) 
     { 
      //send them off to the login page 
      var url = new UrlHelper(filterContext.RequestContext); 
      var loginUrl = url.Content("~/Account/LogOff"); 
      session.RemoveAll(); 
      session.Clear(); 
      session.Abandon(); 
      filterContext.HttpContext.Response.Redirect(loginUrl, true); 
     } 
    } 
} 
3

這個答案在很大程度上基於邁克爾斯除了它工作;-)

我改成了坐委託檢查會話是否已結束,以便它可以在不同的應用程序中工作,這些應用程序可能有不同的確定方式,而且登錄頁面可能在其他應用程序中有所不同。在Global.asax.cs中的Application_Start()在我的應用程序代碼中,我已經是

CheckUserSessionAttribute.CheckSessionAlive = session => (session.GetUser() != null); 
CheckUserSessionAttribute.LoginUrl = "~/Account/Login"; 

那麼屬性類是如下

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
    public class CheckUserSessionAttribute : ActionFilterAttribute 
    { 
     public static String LoginUrl { get; set; } 
     public delegate bool CheckSessionDelegate(HttpSessionStateBase session); 

     public static CheckSessionDelegate CheckSessionAlive; 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 

      HttpSessionStateBase session = filterContext.HttpContext.Session; 
      if ((CheckSessionAlive == null) || (CheckSessionAlive(session))) 
        return; 


      //send them off to the login page 
      var url = new UrlHelper(filterContext.RequestContext); 
      var loginUrl = url.Content(LoginUrl); 
      session.RemoveAll(); 
      session.Clear(); 
      session.Abandon(); 

      filterContext.HttpContext.Response.StatusCode = 403; 
      filterContext.HttpContext.Response.Redirect(loginUrl, false); 
      filterContext.Result = new EmptyResult(); 

     } 
    } 

從控制器只需添加[CheckUserSession]上面的屬性班級或個人行爲。

相關問題