日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
淺談基于URL的權限控制ASP.NETMVC中的實現

淺談基于URL的權限控制ASP.NET MVC中的實現

10年積累的網站建設、網站制作經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先網站制作后付款的網站建設流程,更有松山免費網站建設讓你可以放心的選擇與我們合作。

在數據庫中新建2個表。PermissionItem表用于保存權限ID和頁面路徑的關系,一個權限ID可以有多個頁面,一般同一個權限ID下的頁面是為了實現同一個功能。PermissionList表用于保存用戶所具有的權限。

 
 
 
 
  1. Code  
  2. USE [UrlAuthorize]  
  3. GO  
  4. /****** Object:  Table [dbo].[PermissionList]    Script Date: 07/07/2009 00:07:10 ******/  
  5. SET ANSI_NULLS ON  
  6. GO  
  7. SET QUOTED_IDENTIFIER ON  
  8. GO  
  9. CREATE TABLE [dbo].[PermissionList](  
  10.     [ID] [int] IDENTITY(1,1) NOT NULL,  
  11.     [PermissionID] [int] NOT NULL,  
  12.     [UserID] [int] NOT NULL,  
  13.  CONSTRAINT [PK_PermissionList] PRIMARY KEY CLUSTERED   
  14. (  
  15.     [ID] ASC  
  16. )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]  
  17. ) ON [PRIMARY]  
  18. GO  
  19. SET IDENTITY_INSERT [dbo].[PermissionList] ON  
  20. INSERT [dbo].[PermissionList] ([ID], [PermissionID], [UserID]) VALUES (1, 2, 1)  
  21. INSERT [dbo].[PermissionList] ([ID], [PermissionID], [UserID]) VALUES (2, 3, 1)  
  22. SET IDENTITY_INSERT [dbo].[PermissionList] OFF  
  23. /****** Object:  Table [dbo].[PermissionItem]    Script Date: 07/07/2009 00:07:10 ******/  
  24. SET ANSI_NULLS ON  
  25. GO  
  26. SET QUOTED_IDENTIFIER ON  
  27. GO  
  28. SET ANSI_PADDING ON  
  29. GO  
  30. CREATE TABLE [dbo].[PermissionItem](  
  31.     [ID] [int] IDENTITY(1,1) NOT NULL,  
  32.     [PermissionID] [int] NOT NULL,  
  33.     [Name] [nvarchar](50) NOT NULL,  
  34.     [Route] [varchar](100) NOT NULL,  
  35.  CONSTRAINT [PK_PermissionItem] PRIMARY KEY CLUSTERED   
  36. (  
  37.     [ID] ASC  
  38. )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]  
  39. ) ON [PRIMARY]  
  40. GO  
  41. SET ANSI_PADDING OFF  
  42. GO  
  43. SET IDENTITY_INSERT [dbo].[PermissionItem] ON  
  44. INSERT [dbo].[PermissionItem] ([ID], [PermissionID], [Name], [Route]) VALUES (1, 1, N'測試頁1', N'/Test/Page1')  
  45. INSERT [dbo].[PermissionItem] ([ID], [PermissionID], [Name], [Route]) VALUES (2, 2, N'測試頁2', N'/Test/Page2')  
  46. INSERT [dbo].[PermissionItem] ([ID], [PermissionID], [Name], [Route]) VALUES (3, 3, N'測試頁3', N'/Test/Page3')  
  47. INSERT [dbo].[PermissionItem] ([ID], [PermissionID], [Name], [Route]) VALUES (5, 1, N'測試頁4', N'/Test/Page4')  
  48. INSERT [dbo].[PermissionItem] ([ID], [PermissionID], [Name], [Route]) VALUES (6, 2, N'測試頁5', N'/Test/Page5')  
  49. SET IDENTITY_INSERT [dbo].[PermissionItem] OFF 

數據庫中的示例表示Page1和Page4同屬于權限1,Page2和Page5同屬于權限2,Page3屬于權限3。用戶ID為1的用戶具有權限2和3。

在ASP.NET MVC項目中新建一個AccountHelper類,這是一個輔助類。GetPermissionItems方法用于獲取權限ID和頁面路徑的對應關系。這是全局的,并且每個用戶在訪問頁面時都會用到這些信息,所以存入Cache中。數據庫的相關操作這里使用的是ADO.NET Entity Framework。

 1/**//// 
 2/// 獲取權限項
 3///

 4/// 權限項列表
 5public static List GetPermissionItems()
 6{
 7     // 如果緩存中已經存在權限列表信息,則直接從緩存中讀取。
 8      if (HttpContext.Current.Cache["PermissionItems"] == null)
 9     {
10          // 如果緩存中沒有權限列表信息,則從數據庫獲取并寫入緩存
11           UrlAuthorizeEntities db = new UrlAuthorizeEntities();
12          var items = db.PermissionItem.Where(c => c.PermissionID > 0).ToList();
13          HttpContext.Current.Cache["PermissionItems"] = items;
14     }
15
16     // 這個緩存中保存了所有需要進行權限控制的頁面所對應的權限ID
17     return (List)HttpContext.Current.Cache["PermissionItems"];
18}
19

GetUserPermission方法是將用戶所具有的權限ID保存到一個一維Int32數組中。這個信息每個用戶是不同的,但是會經常使用到,所以存入Session。

1/**//// 
 2/// 獲取用戶權限
 3///

 4/// 用戶ID
 5/// 用戶權限數組
 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頁生命周期身份驗證階段執(zhí)行它。

1/**//// 
 2/// 重寫OnAuthorization
 3///

 4///
 5public override void OnAuthorization(AuthorizationContext filterContext)
 6{
 7    // 獲取權限項列表
 8    List 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(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進行處理。如果某一個Action被標上了[UrlAuthorize],而數據庫中又不存在該頁面對應的權限ID,那么根據示例的代碼,所有用戶都將無法訪問這個頁面,如果需要更改這個設置,可以修改上面“注1”下面的2行代碼。


分享標題:淺談基于URL的權限控制ASP.NETMVC中的實現
URL標題:http://www.dlmjj.cn/article/djodood.html