**1. 在ASP.NET MVC项目中新建一个AccountHelper类,这是一个辅助类。GetPermissionItems方法用于获取权限ID和页面路径的对应关系。<br/>
这是全局的,并且每个用户在访问页面时都会用到这些信息,所以存入Cache中。<br/>**
/**//// <summary>
/// 获取权限项
/// </summary>
/// <returns>权限项列表</returns>
public static List<PermissionItem> GetPermissionItems()
{
// 如果缓存中已经存在权限列表信息,则直接从缓存中读取。
if (HttpContext.Current.Cache["PermissionItems"] == null)
{
// 如果缓存中没有权限列表信息,则从数据库获取并写入缓存
UrlAuthorizeEntities db = new UrlAuthorizeEntities();
var items = db.PermissionItem.Where(c => c.PermissionID > 0).ToList();
HttpContext.Current.Cache["PermissionItems"] = items;
}
// 这个缓存中保存了所有需要进行权限控制的页面所对应的权限ID
return (List<PermissionItem>)HttpContext.Current.Cache["PermissionItems"];
}
**2.GetUserPermission方法是将用户所具有的权限ID保存到一个一维Int32数组中。<br/>这个信息每个用户是不同的,但是会经常使用到,所以存入Session。**
/**//// <summary>
/// 获取用户权限
/// </summary>
/// <param name="userID">用户ID</param>
/// <returns>用户权限数组</returns>
public static Int32[] GetUserPermission(int userID)
{
// 如果缓存中已经存在权限列表信息,则直接从缓存中读取。
if (HttpContext.Current.Session["Permission"] == null)
{
// 从数据库获取用户权限并将权限ID放到int数组并存入Session
UrlAuthorizeEntities db = new UrlAuthorizeEntities();
var permissions = db.PermissionList.Where(c => c.UserID == userID).Select(c=>c.PermissionID).ToArray();
HttpContext.Current.Session["Permission"] = permissions;
}
return (Int32[])HttpContext.Current.Session["Permission"];
}
**3. 再新建一个UrlAuthorizeAttribute类,继承自AuthorizeAttribute,这是一个Filter。<br/>我们重写它的OnAuthorization方法,以在ASP.NET页生命周期身份验证阶段执行它。**
/**//// <summary>
/// 重写OnAuthorization
/// </summary>
/// <param name="filterContext"></param>
public override void OnAuthorization(AuthorizationContext filterContext)
{
// 获取权限项列表
List<PermissionItem> pItems = AccountHelper.GetPermissionItems();
// 获取当前访问页面对应的权限ID。如果item为空则表示当前页面没有权限控制信息,不需要进行权限控制
var item = pItems.FirstOrDefault(c => c.Route == filterContext.HttpContext.Request.Path);
if (item != null)
{
if (Array.IndexOf<Int32>(AccountHelper.GetUserPermission(int.Parse(filterContext.HttpContext.Session["UserID"].ToString())), item.PermissionID) == -1)
{
// 提示权限不够,也可以跳转到其他页面
filterContext.HttpContext.Response.Write("没有权限访问该页面");
filterContext.HttpContext.Response.End();
}
}
else
{
// 如果权限项列表中不存在当前页面对应的权限ID则所有用户都不允许访问,直接提示无权访问。***注1***
filterContext.HttpContext.Response.Write("没有权限访问该页面");
filterContext.HttpContext.Response.End();
}
}
[本文摘自]
(http://www.cnblogs.com/snowdream/archive/2009/07/07/url-authorize-in-aspnet-mvc.html)
个人观点:
可直接获取出当前用户具有的权限URL存入Session中,用以判断是否具有权限。缺点:Session会存入大量的数据。