如何在MVC中验证凭据并重定向到错误的登录页面

时间:2010-12-21 20:03:40

标签: asp.net-mvc security authentication

我希望集中身份验证,开发人员可以自由担心安全性的实现。

我不想在每个请求中验证身份验证,例如

public class HomeController : BaseController
{    
    public ActionResult Home()    
    {        
        if (Request.IsAuthenticated == true)        
        {            
            return RedirectToAction("Home", "Member");        
        }        
        return View();    
    }    

    public ActionResult Resources()    
    {        
        if (Request.IsAuthenticated == true)        
        {            
            return RedirectToAction("Resources", "Member");        
        }        
        return View();    
    }
}

谢谢

2 个答案:

答案 0 :(得分:2)

您可以通过为应用程序内的所有控制器使用BaseController来集中您的凭据验证

public class BaseSupplierFlyersController : BaseController
  {
    //
    // GET: /SupplierFlyers/
    public ActionResult Index(string culture)
    {
      //Some action logic here
      return View("Index");
    }
}

在你的BaseControler中

public class BaseController : Controller
  {
    private bool IsLoged = false;
    public BaseController()
      : base()
    {

    }

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
      if (!IsLoged)
      {
        //Redirection du bad login.
        //Affect the Result to cancelled previous Action execution
        filterContext.Result = new RedirectResult(string.Concat("~/", ControllerConstants.Error,"/", ActionConstants.BadLogin));
      }
      base.OnActionExecuting(filterContext);
    }

    protected override void Execute(RequestContext requestContext)
    {
      //Validate Credential
      ValidateCredential(requestContext);
      //Traitement standard
      base.Execute(requestContext);
    }

    private void ValidateCredential(RequestContext requestContext)
    {
      //Logic to validate credential here
      IsLoged = true; //or false
    }
  }

每次触发Controller的操作时,BaseController都会在Execute方法中验证凭据,而在OnActionExecuting中,如果凭据有效,则可以进行验证,而不是像重定向那样执行其他页面。

答案 1 :(得分:1)

查看您编写的代码,似乎您缺少属于asp.net mvc的Action Filters。有一个内置的名为Authorize,基本上需要在调用控制器方法之前对请求进行身份验证,但创建自己的请求非常简单。

同样在asp.net mvc 3中,您可以定义全局过滤器,这些过滤器将成为控制器上调用的每个操作的一部分。您可以找到一些示例here