如何保护MVC中的页面

时间:2014-04-19 17:57:28

标签: asp.net-mvc authorization

我是MVC的新手,但是长时间使用网络表单。我曾经使用位置标记来保护webform中的页面。因此,当任何人尝试访问我的product.aspx或SalesReport.aspx时,用户会重定向到登录页面,登录后他们可以访问这些页面。

<location path="product.aspx">
    <system.web>
        <authorization>
            <deny users="*" />
        </authorization>
    </system.web>
</location>

<location path="SalesReport.aspx">
    <system.web>
        <authorization>
            <deny users="*" />
        </authorization>
    </system.web>
</location>

所以在MVC中没有像页面这样的概念,而在这里我们使用控制器和动作方法。 所以引导我人们在mvc中通过编码和配置文件来保护私人页面

我们可以在mvc中使用位置标记,如果是,那么如何......给我一些样本。

我怎样才能保护完整的控制器并且有时候想在控制器内部保护一些动作方法。

我想保护可以通过编码和操作配置文件来完成。所以我正在寻找两种不同的方法。

所以指导我如何通过代码保护文件以及如何通过像使用位置标记一样使用配置文件来保护文件。感谢

1 个答案:

答案 0 :(得分:2)

您可以编写自定义操作过滤器,并根据需要将其应用于您的控制器/操作方法。此自定义筛选器将检查用户是否已登录,然后将用户重定向到登录页面或继续执行(执行操作方法并返回响应)

有些事情是这样的。您可以将其保留在BaseController类中,并从中继承其他控制器。

public class BaseController : Controller
{
  public class VerifyLogin : ActionFilterAttribute
  {
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
      bool validUser;
      // check user is logged in or not here
      //you may check Identity or Session or whatever method you want
      //and set validUser value to true if user is valid/logged in        

       if(validUser)            
       {
           return;
       }

       string baseUrl = filterContext.HttpContext.Request.Url.Scheme 
                       + "://" + filterContext.HttpContext.Request.Url.Authority 
                + filterContext.HttpContext.Request.ApplicationPath.TrimEnd('/') 
                + "/";

        //Redirect user to login page
        filterContext.Result = new RedirectResult(baseUrl + "account/login");
     }
  }
}

您可以在 控制器 操作 方法上应用此过滤器。

控制器级别

[VerifyLogin]
public ProductController : BaseController
{
   public ActionResult Index() 
   {
     return View();
   }    
}

操作方法级别

public SalesController : BaseController
{
   [VerifyLogin]
   public ActionResult SecretReport() 
   {
     return View();
   }  

   public ActionResult PublicReport() 
   {
     //filter is not applied to this action method
     return View();
   }   
}