ASP.NET MVC权限管理

  ASP.NET MVC提供了AuthorizeAttribute,可用来控制Controller Action的安全性,但由于该属性所指定的角色或用户是写在代码中而不是在配置文件中的,因而不够灵活。

  为能够更灵活、更细粒度地控制权限,需要某种方法能够在配置文件(如web.config)中定义权限,这样才能在不需要重新编译代码的情况下,通过修改配置文件即可改变应用程序的授权。一个简单的场景,[CustomAuthorize(Roles = "Manager")] ,与系统自带的[Authorize(Roles = "Manager")] ,区别在于:后面的权限控制是通过Membership Provider完成的,即当前用户有没有权限是通过Context.User.IsInRole("Managers")来判断的;第一个则是自定义ActionFilter通过读取配置项来完成权限控制的。

   废话不说,上代码:

1. 从系统自带的AuthorizeAttribute继承(请注意:AuthorizeAttribute本身是从FilterAttribute继承且实现IAuthorizationFilter接口):

public class CustomAuthorizeAttribute : AuthorizeAttribute {
......
}

 

 

2. override其中关键的一个方法:AuthorizeCore

复制代码
1 protected override bool AuthorizeCore(HttpContextBase httpContext) {
2 ...
3 }
4  
5 private static bool UserInRole(string role) {
6    if (user.IsInRole(role))
7         return true;
8     return false
9 
复制代码

 

 

 

3. 实现自定义授权: 

复制代码
protected override bool AuthorizeCore(HttpContextBase httpContext) {
if (httpContext == null){  
    
throw new ArgumentNullException("httpContext");  
}
 
IPrincipal user 
= httpContext.User;
 
if (!user.Identity.IsAuthenticated) {
    
return false;
}
 
var rolesInSetting 
= ConfigurationManager.AppSettings["RolesFor:" + Roles]; 
var usersInSetting = ConfigurationManager.AppSettings["UsersFor:" + Users];

 

if (!String.IsNullOrEmpty(usersInSetting)) {
    
var users = usersInSetting.Split(newchar[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

  if (users != null|| users.Length > 0 && users.Contains(User.Identity.Name, StringComparer.OrdinalIgnoreCase))

    return true; 

 

if (String.IsNullOrEmpty(rolesInSetting))
    
returnfalsevar roles = rolesInSetting.Split(newchar[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 
if (roles ==null|| roles.Length <=0)
    
returnfalse;

if (roles.Any(t => UserInRole(t))  
    
returntrue;

returnfalse}

复制代码

 

 

4. 配置文件 web.config

<add key="RolesFor:Manager" value="admins, managers"/>

<add key="UsersFor:Manager" value="hackee,bill"/>

 

 

5. 配置Action方法:

 

[CustomAuthorize(Manager)]
public ActionResult GetSecureData() { ... } 

 

 

 

 

   

posted @   hackee  阅读(2838)  评论(2编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示