2016-09-26 177 views
1

我的項目獲得頁面[Authorize],用戶必須登錄才能訪問這些頁面。允許用戶訪問[Authorize]頁面 - MVC

如果在數據庫中使用相同的用戶標識和密碼成功登錄,當前用戶標識將存儲在會話中。但我該如何進行身份驗證/允許用戶使用[授權]訪問頁面?

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Login(User u) 
    { 

     if (ModelState.IsValid) //this is check validity 
     { 

      using (UserEntities db = new UserEntities()) 
      { 

       var v = db.Users.Where(a=>a.UserName.Equals(u.UserName) && a.Password.Equals(u.Password)).FirstOrDefault(); 
       if (v != null) 
       { 
        Session["LoggedUserID"] = u.Id.ToString(); 
        Session["UserFullname"] = u.Name.ToString(); 

        return RedirectToAction("AfterLogin"); 

       } 

      } 
     } 
     return View(u); 
    } 

任何幫助是非常感謝。謝謝。

回答

3

如果您絕對想使用Session自己管理登錄和安全性,您可以創建自己的操作篩選器,檢查會話是否設置了用戶標識。

像這樣的事情

public class AuthorizeWithSession : ActionFilterAttribute 
{  
    public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     if (context.HttpContext.Session == null || 
             context.HttpContext.Session["LoggedUserID"]==null) 
     { 
      context.Result = 
       new RedirectToRouteResult(new RouteValueDictionary(
            new {controller = "Account", action = "Login"})); 
     } 
     base.OnActionExecuting(context); 
    } 
} 

現在對你的安全行動裝點這個動作過濾器/控制器

[AuthorizeWithSession] 
public class TeamController : Controller 
{ 
} 
+0

啊感謝,但我應該在哪裏把這個類在MVC?我很新,所有這些排序仍然令人困惑。 – skylake

+0

TryGetValue有問題,因爲我得到以下錯誤 - ..'由於其保護級別而無法訪問。無法解析符號TryGetValue'.'不知道如何解決這個問題。 – skylake

+1

啊!該代碼是針對aspnet核心的。對於其他版本的MVC,您可以對該密鑰執行空值檢查(答案已更新)。你可以把這個班放在你的項目的任何地方。我更喜歡創建一個名爲「Filters」的目錄並將所有過濾器放在該過濾器下。 – Shyju

1

你應該有你自己的角色管理,如果你想控制哪些用戶可以做。 每個用戶都應該有一個或多個角色,每個角色可以擁有一組權限,並且您可以創建一個從AuthorizeAttribute繼承的操作篩選器,以確保它儘早執行。

在AuthorizeAttribute的AuthorizeCore方法中,您將看到用戶是否已通過身份驗證,如果已通過身份驗證,則可以讀取其身份,從數據庫中讀取其角色和權限,並將其與傳遞的值進行比較到角色。

例如:

public class RequireRoleAttribute : AuthorizeAttribute 
    { 
     public RoleEnum[] RequiredRoles { get; set; } 


     public RequireRoleAttribute() 
     { 

     } 

     public RequireRoleAttribute(params RoleEnum[] roles) 
      : this() 
     { 
      RequiredRoles = roles; 
     } 

     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
      var principle = httpContext.User; 

      if (principle == null || principle.Identity == null || !principle.Identity.IsAuthenticated) 
      { 
       return false; 
      } 

      if (RequiredRoles != null) 
      { 
       if (!HasRole(RequiredRoles)) 
       { 
        httpContext.Response.Redirect("/AccessDenied"); 
       } 
      } 

      return base.AuthorizeCore(httpContext); 
     } 


     public bool HasRole(RoleEnum[] roles) 
     { 
      foreach (var role in roles) 
      { 
       if (HasRole(role)) 
        return true; 
      } 

      return false; 
     } 

     public bool HasRole(RoleEnum role) 
     { 
      return true if the user role has the role specified (read it from database for example) 
     } 
    } 

然後在你的控制器,只需標註控制器或動作與屬性

[RequireRole(RoleEnum.Administator)] 
    public class MySecureController : Controller 
    { 
    } 
+0

感謝您的啓發。 'RoleEnum []'不能解決,我該如何處理? – skylake

+1

RoleEnum []只是一個包含您的角色列表的枚舉,例如:Customer,Administrator,User。 ' 公共枚舉RoleEnum { 管理員, 客戶 } –

相關問題