Asp.net MVC自定义权限
MVC框架的一个很重要的优势在于可拓展性很高。权限的管理在每一个Web应用程序中都非常重要,虽然微软提供了Membership的默认权限设置,但在更多的情况下,Membership默认的权限设置并不能满足我们实际的需要。
下面本文将用一种简单的办法来自定义权限。
在MVC框架中,属性常用来限定控制器(Controller)的访问。所以我们首先从AuthorizeAttribute类中继承一个自定义的权限类。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 7 namespace MvcApplication_AuthorizeAttribute.Models 8 { 9 public class MyAuthAttribute : AuthorizeAttribute 10 { 11 // 只需重载此方法,模拟自定义的角色授权机制 12 protected override bool AuthorizeCore(HttpContextBase httpContext) 13 { 14 if (!httpContext.User.Identity.IsAuthenticated)//判断用户是否通过验证 15 return false; 16 string[] StrRoles = Roles.Split(',');//通过逗号来分割允许进入的用户角色 17 if (string.IsNullOrWhiteSpace(Roles))//如果只要求用户登录,即可访问的话 18 return true; 19 bool isAccess = JudgeAuthorize(httpContext.User.Identity.Name, StrRoles); 20 if (StrRoles.Length > 0 && isAccess) //先判断是否有设用户权限,如果没有不允许访问 21 return false; 22 23 return true; 24 } 25 /// <summary> 26 /// 根据用户名判断用户是否有对应的权限 27 /// </summary> 28 /// <param name="UserName"></param> 29 /// <param name="StrRoles"></param> 30 /// <returns></returns> 31 private bool JudgeAuthorize(string UserName, string[] StrRoles) 32 { 33 string UserAuth = GetRole(UserName); //从数据库中读取用户的权限 34 return StrRoles.Contains(UserAuth, //将用户的权限跟权限列表中做比较 35 StringComparer.OrdinalIgnoreCase); //忽略大小写 36 } 37 38 39 40 // 返回用户对应的角色, 在实际中, 可以从SQL数据库中读取用户的角色信息 41 private string GetRole(string name) 42 { 43 switch (name) 44 { 45 case "aaa": return "User"; 46 case "bbb": return "Admin"; 47 case "ccc": return "God"; 48 default: return "Fool"; 49 } 50 } 51 } 52 }
以上的代码只是示例而已。你可以将实际的权限控制逻辑写在自定义的权限控制类(MyAuthAttribute)里面。如果在特定的业务过程中,用户没有访问权限,就返回false。然后我们要做的就是把这个类属性放在要控制的控制器(Controller)或者Action上面。代码如下所示。
1 [MyAuth(Roles = "User")] 2 public ActionResult About() 3 { 4 return View(); 5 }
这样,我们就完成了简单的自定义权限了。
作者:kissazi2
出处:http://www.cnblogs.com/kissazi2/
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!