授权过滤器要继承System.Web.Mvc命名空间下AuthorizeAttribute类,指定用户访问就是利用了Users属性,并由基类帮我们验证,只放指定Users用户通过;要实现自定义验证,重写下面的OnAuthorization和AuthorizeCore方法就可以了。
//OnAuthorization获取通过路由跳转的Action,并得到进入某Action视图所需权限列表
//AuthorizeCore获取登录用户的权限,查看是否包含在Action权限列表里面
namespace System.Web.Mvc
{
// 指定对控制器或操作方法的访问只限于满足授权要求的用户。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
// 初始化 System.Web.Mvc.AuthorizeAttribute 类的新实例。
public AuthorizeAttribute();
// 获取或设置有权访问控制器或操作方法的用户角色。
public override object TypeId { get; }
// 获取或设置有权访问控制器或操作方法的用户。
public string Users { get; set; }
// 在过程请求授权时调用。
public virtual void OnAuthorization(AuthorizationContext filterContext);
// 重写时,提供一个入口点用于进行自定义授权检查。
protected virtual bool AuthorizeCore(HttpContextBase httpContext);
// 处理未能授权的 HTTP 请求。。
protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext);
// 在缓存模块请求授权时调用。。
protected virtual HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext);
}
}
[Authorize]
[UserAuthorize(AuthorizationFailView = "Error")] //授权失败跳转Error视图
public ActionResult Welcome()
{
return View();
}
public class UserAuthorize : AuthorizeAttribute
{
/// <summary>
/// 授权失败时呈现的视图
/// </summary>
public string AuthorizationFailView { get; set; }
/// <summary>
/// 请求授权时执行
/// </summary>
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.HttpContext.Response.Redirect("/Account/LogOn");
}
//获得url请求里的controller和action:
string controllerName = filterContext.RouteData.Values["controller"].ToString().ToLower();
string actionName = filterContext.RouteData.Values["action"].ToString().ToLower();
//string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
//string actionName = filterContext.ActionDescriptor.ActionName;
//根据请求过来的controller和action去查询可以被哪些角色操作:
Models.RoleWithControllerAction roleWithControllerAction =
SampleData.roleWithControllerAndAction.Find(r => r.ControllerName.ToLower() == controllerName &&
r.ActionName.ToLower() == actionName);
if (roleWithControllerAction != null)
{
this.Roles = roleWithControllerAction.RoleIds; //有权限操作当前控制器和Action的角色id
}
base.OnAuthorization(filterContext);
}
/// <summary>
/// 自定义授权检查(返回False则授权失败)
/// </summary>
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext.User.Identity.IsAuthenticated)
{
string userName = httpContext.User.Identity.Name; //当前登录用户的用户名
Models.User user = SampleData.users.Find(u => u.UserName == userName); //当前登录用户对象
if (user != null)
{
Models.Role role = SampleData.roles.Find(r => r.Id == user.RoleId); //当前登录用户的角色
foreach (string roleid in Roles.Split(','))
{
if (role.Id.ToString() == roleid)
return true;
}
return false;
}
else
return false;
}
else
{
return false; //进入HandleUnauthorizedRequest
}
}
/// <summary>
/// 处理授权失败的HTTP请求
/// </summary>
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result = new ViewResult { ViewName = AuthorizationFailView };
}
}