2017-03-13 62 views
1

我正在構建一個排序的訂購系統,需要用戶在繼續進行網站的主要訂購部分之前登錄。例如,我有一個登錄控制器(如果用戶存在於數據庫中)將其ID和用戶名分配給會話。C#,ASP.NET - 限制對控制器方法的訪問

public ActionResult Login(AccountAccess userObj) 
{ 
    if (ModelState.IsValid) 
    { 
     using (SC_DBEntities db = new SC_DBEntities()) 
     { 
      var accountObj = db.Users_Account.Where(u => u.Account_UserName.Equals(userObj.Account_UserName)).FirstOrDefault(); 
      if (accountObj != null) 
      { 
       var accessObj = db.Users_Access.Where(a => a.Account_ID.Equals(accountObj.Account_ID) && a.Access_Password.Equals(userObj.Access_Password)).FirstOrDefault(); 
       if (accessObj != null) 
       { 
        Session["Account_ID"] = accountObj.Account_ID.ToString(); 
        Session["Account_UserName"] = accountObj.Account_UserName.ToString(); 
        return RedirectToAction("Index", "Home"); 
       } 
      } 
     } 
    } 
    return View(userObj); 
} 

我想從這裏做的是阻止訪問其他方法操作,如果該會話爲空。例如,如果他們想要訪問產品頁面,但他們沒有登錄,則會被重定向到登錄頁面。

我對ASP.NET仍然比較陌生,所以如果除了Sessions之外還有更高效的方法來實現這種效果,請告訴我。

+0

https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions-1/controllers-and-routing/understanding-action-filters-cs,http://stackoverflow.com/questions/21231751/authorize-filter-and-authentication是一些很好的開始。基本上,使用授權操作篩選器來確定是否授予訪問權限。 – ps2goat

+0

從技術上講'身份證'應該比會話更好,但是我也使用會議,他們爲他們的預期目的工作。所有你需要的是一個別人來處理,當你沒有找到用戶後,你是否...是你所要求的? – Rinktacular

+0

@Rinktacular,不完全。我的意思是說,我們有人在使用網站,但他們還沒有登錄。在主頁上,可以選擇他們想要訂購的方式並訪問登錄和註冊頁面。我試圖達到的目標是:假設我們有人在查看尚未登錄的主頁,他們點擊訂購鏈接,但不是轉到訂購頁面,而是轉到登錄頁面。基本上,我試圖阻止沒有登錄的人訪問其他控制器方法。 – LittleAngryProgrammer

回答

4

你能不能使用ActionFilterAttribute?

public class CheckSession: ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      var MySession = HttpContext.Current.Session 

      if(MySession["Account_ID"] == null || MySession["Account_UserName"]== null) 
      { 
       filterContext.Result = new RedirectResult(string.Format("/Account/")); 
      } 
     } 
    } 

然後,所有你需要做的就是把它放在你的控制器動作 - 也可以把它的控制器上,檢查所有控制器內:

[CheckSession] 
public ActionResult Purchase() 
{ 
.... 
} 
+0

這絕對是我在找的。完美的作品!非常感謝你! – LittleAngryProgrammer

-1

根據您的評論,您可以使用Sessions來達到您要求的目的。假設用戶登錄時,您可以像上面那樣存儲,說出用戶名和他們的ID。如果您想在運行某個操作之前確保有人登錄,只需檢查這些會話變量是否爲空。

與您登錄控制器代碼一起去,假設你有一個購買控制器動作:

public ActionResult Purchase() 
{ 
    //Check to see if these values have been assigned via Login Controller Action 
    if(Session["Account_ID"] == null || Session["Account_UserName"] == null) 
    { 
     //If so, redirect to Controller Action where user can log into. 
     RedirectToAction("Index", "Account") 
    } 
    else 
    { 
     //Make Purchase occur. 
    } 
} 

Identity是一個較新的,更好的登錄系統,但在我的經驗,一個相當大的學習曲線。一旦你對Sessions更加熟悉,我建議開始考慮未來項目的Identity。 Sessions沒有什麼「錯誤」,所以出於您的目的,上面的代碼應該適用於您希望用戶登錄使用的操作。

+0

確定,這將適用於我正在查看的內容。我認爲這意味着必須將這樣一個IF聲明附加到我想要限制的每個操作上? – LittleAngryProgrammer

+0

或多或少......我不確定這段代碼有多「好」,但我在過去的項目中使用過這種方式來處理登錄,並且它對於我希望它具有的目的是有效的:) – Rinktacular

+0

還行將研究它。感謝您的建議! – LittleAngryProgrammer

相關問題