想做一个过滤器来验证用户是否登录,但是有两个区域,一个是Admin后台管理的、一个是网站首页游客浏览的不用登录。
在App_Start里的FilterConfig.cs会验证全局的吧,想问怎样只验证Admin这个区域里的controllers?
不是在全局里定义,你定义一个需要登记才能访问的Controller,如SignController
public class SignedController : ExceptionController
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
//在些判断用户是否已经登录,若未登录,则跳转到登录页面,同时把当前的url作为参数
if(!login)
{
string ReturnUrl = "/login.html?ReturnUrl=" + filterContext.HttpContext.Server.UrlEncode(filterContext.HttpContext.Request.Url.AbsoluteUri);
//写代码跳转到登录页面
return;
}
}
}
受保护页面的controller就可以继承此SignController
另外一种是使用拦截器,自定义一个拦截器,并在拦截器里进行判断,最后把拦截器 标注在需要先登录的 Action或controller上。
非常感谢你的回复和指导,谢谢。
/// <summary> /// 使用 FormsAuthentication 验证用户权限 /// 验证失败则跳转到登录页面 /// </summary> [RequiresAuthentication] public class RequiresAuthenticationAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { //redirect if not authenticated if (!filterContext.HttpContext.User.Identity.IsAuthenticated) { //use the current url for the redirect string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath; //send them off to the login page string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess); string loginUrl = FormsAuthentication.LoginUrl + redirectUrl; filterContext.HttpContext.Response.Redirect(loginUrl, true); } } }
在定义一个basecontroller
[RequiresAuthentication] public class BaseController : Controller { protected DataContext db = new DataContext(); protected int PageSize { get { int ps; return Int32.TryParse(System.Web.Configuration.WebConfigurationManager.AppSettings["PageSize"], out ps) ? ps : 15; } } }
注意添加的[RequiresAuthentication]特性
然后让你的admin下的所有controller继承basecontroller
非常感谢你的回复和指导,谢谢。