1.权限认证会用到的属性:
.net framework权限认证属性:[AuthorizeAttribute]
.net framework自带的匿名支持属性:[AllowAnonymous]
2.MVC框架中的过滤器注册有三种方式:
[CustomAuthorize]-->自定义权限认证属性
2.1).方法注册
2.2).控制器注册
2.3).全局注册
2.3.1)在FilterConfig.RegisterGlobalFilters()方法里面注册全局过滤器
2.3.2)全局注册自定义权限认正过滤器
3.AOP:不破坏封装的情况下,增加功能,
自定义权限认证CustomAuthorizeAttribute基于AuthorizeAttribute实现了权限校验,AOP做法。
添加特性可以完成权限验证,这是MVC框架支持的
-->ControllerActionInvoke-->控制器实例化方法执行前-->检查特性--> 如果有权限特性就Invoke--> 看结果---> AOP
4.自定义权限认正CustomAuthorizeAttribute
public class CustomAuthorizeAttribute:AuthorizeAttribute
{
/// <summary>
/// 方法执行前,会执行权限验证
/// </summary>
/// <param name="filterContext"></param>
public override void OnAuthorization(AuthorizationContext filterContext)
{
Console.WriteLine(filterContext.HttpContext);//HttpContext中包含请求的所有信息,拿到这个就可以为所欲为了
//如果action方法上面有这个匿名特性,就直接返回,继续向下执行action
if (filterContext.ActionDescriptor.IsDefined(typeof(CustomAllowAnonymousAttribute), true))
{
return;
}
else if (filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(CustomAllowAnonymousAttribute), true))
{
//如果controller上面有这个匿名特性,就直接返回,继续向下执行controller下的action
return;
}
else if (filterContext.HttpContext.Session["CurrentUser"] == null)//session中没有该用户,判断是否登录
{
filterContext.Result = new RedirectResult("~/First/Login");
}
else
{
//判断登录后的用户是否有权限
string account = filterContext.HttpContext.Session["CurrentUser"].ToString();
if (!account.Equals("UserName_123456"))//账户和密码不存在
{
filterContext.Result = new RedirectResult("~/First/Login");
}
else
{
return; //表示继续向下执行Action
}
}
}
}
5.自定义匿名权限认证CustomAllowAnonymousAttribute
6.全局注册权限认证
7.当某个controller的action不想有权限认证的时候,用方法注册,在方法上面注册自定义匿名方法属性