当前位置:编程学习 > asp >>

基于URL的权限把持 ASP.NET MVC中的实现(2)

 

这个信息每个用户是不同的,但是会经常应用到,所以存入Session。

1/**//// <summary>
2/// 获取用户权限
3/// </summary>
4/// <param name="userID">用户ID</param>
5/// <returns>用户权限数组</returns>
6public static Int32[] GetUserPermission(int userID)
7{
8    // 如果缓存中已经存在权限列表信息,则直接从缓存中读取。
9    if (HttpContext.Current.Session["Permission"] == null)
10    {
11        // 从数据库获取用户权限并将权限ID放到int数组并存入Session
12        UrlAuthorizeEntities db = new UrlAuthorizeEntities();
13        var permissions = db.PermissionList.Where(c => c.UserID == userID).Select(c=>c.PermissionID).ToArray();
14        HttpContext.Current.Session["Permission"] = permissions;
15    }
16    return (Int32[])HttpContext.Current.Session["Permission"];
17}
18

再新建一个UrlAuthorizeAttribute类,继承自AuthorizeAttribute,这是一个Filter。我们重写它的OnAuthorization法子 ,以在ASP.NET页生命 周期身份验证阶段履行它。

1/**//// <summary>
2/// 重写OnAuthorization
3/// </summary>
4/// <param name="filterContext"></param>
5public override void OnAuthorization(AuthorizationContext filterContext)
6{
7    // 获取权限项列表
8    List<PermissionItem> pItems = AccountHelper.GetPermissionItems();
9
10    // 获取当前造访 页面对应的权限ID。如果item为空则表现 当前页面没有权限把持 信息,不需要 进行权限把持
11    var item = pItems.FirstOrDefault(c => c.Route == filterContext.HttpContext.Request.Path);
12
13    if (item != null)
14    {
15        if (Array.IndexOf<Int32>(AccountHelper.GetUserPermission(int.Parse(filterContext.HttpContext.Session["UserID"].ToString())), item.PermissionID) == -1)
16        {
17            // 提示 权限不够,也可以跳转到其他页面
18            filterContext.HttpContext.Response.Write("没有权限造访 该页面");
19            filterContext.HttpContext.Response.End();
20        }
21    }
22    else
23    {
24        // 如果权限项列表中不存在当前页面对应的权限ID则所有用户都不容许 造访 ,直接提示 无权造访 。***注1***
25        filterContext.HttpContext.Response.Write("没有权限造访 该页面");
26        filterContext.HttpContext.Response.End();
27    }
28}
29

至此,首要的工作都已经完成了的。接下来我们只需要 在需要 进行基于URL权限把持的Action或Controller前加上[UrlAuthorize],这些Action或Controller中的所有Actions就会主动被UrlAuthorize这个Filter进行处理 。

补充:Web开发 , ASP.Net ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,