当前位置: 首页 > article >正文

.Net Web API 访问权限限定

看到一个代码是这样的:

c# webapi 上

[Route("api/admin/file-service"), AuthorizeAdmin]

AuthorizeAdmin 的定义是这样的

public class AuthorizeAdminAttribute : AuthorizeAttribute
{
    public AuthorizeAdminAttribute()
    {
        Roles = "admin";
    }
}

这个AuthorizeAdmin 有什么用?

AuthorizeAdminAttribute 是一个自定义的授权属性,继承自 AuthorizeAttribute,其目的是对控制器或动作方法进行访问控制,确保只有角色为 "admin" 的用户能够访问该方法或控制器。

解析 AuthorizeAdminAttribute 的工作原理

  1. 继承自 AuthorizeAttributeAuthorizeAttribute 是 ASP.NET Core 中的一个内置特性,它用于指定访问某个控制器或方法的权限要求。当你使用 Authorize 特性时,系统会检查当前请求的用户是否已经通过身份验证,并且是否符合指定的授权要求(例如角色、权限等)。

  2. Roles = "admin": 在 AuthorizeAdminAttribute 构造函数中,设置了 Roles = "admin"。这意味着,只有角色为 "admin" 的用户才能访问使用该特性标记的控制器或方法。换句话说,只有角色为 "admin" 的用户,系统才会允许其访问这部分代码。如果用户的角色不是 "admin",他们将无法访问这个 API,通常会返回 HTTP 403 (Forbidden) 错误。

  3. 自定义授权特性AuthorizeAdminAttribute 是一个自定义特性,实际上它是通过继承 AuthorizeAttribute 来实现的。在使用时,它可以像其他特性一样直接应用到控制器或方法上。

示例

假设有一个 API 控制器,只有管理员可以访问某些操作:

[Route("api/admin/file-service")]
[AuthorizeAdmin]  // 只有角色为 admin 的用户可以访问
public class FileServiceController : ControllerBase
{
    [HttpGet]
    public IActionResult GetFiles()
    {
        // 逻辑:返回文件列表
        return Ok(new { files = "file1.txt", "file2.txt" });
    }
    
    [HttpPost]
    public IActionResult UploadFile(IFormFile file)
    {
        // 逻辑:上传文件
        return Ok(new { message = "File uploaded successfully!" });
    }
}

细节

  • 身份验证:为了使用 AuthorizeAdminAttribute,用户必须先通过身份验证(比如使用 JWT Token 或 Cookie 认证)。如果用户未认证,系统会拒绝访问,返回一个 401(Unauthorized)状态码。
  • 角色验证:在认证通过的基础上,AuthorizeAdminAttribute 还会验证用户的角色,确保用户具有 "admin" 角色。角色通常是通过认证时返回的 JWT token 或服务器的身份验证系统来附带的。

总结

AuthorizeAdminAttribute 的作用是:

  • 限制访问该控制器或方法的用户必须具备 admin 角色。
  • 它是基于 ASP.NET Core 的 AuthorizeAttribute 特性自定义的。
  • 它确保了只有管理员角色的用户才能访问标记为 [AuthorizeAdmin] 的 API 接口,从而提高了系统的安全性。


http://www.kler.cn/a/528409.html

相关文章:

  • go-zero学习笔记(一)
  • EasyExcel使用详解
  • CAN总线数据采集与分析
  • [论文阅读] (37)CCS21 DeepAID:基于深度学习的异常检测(解释)
  • DeepSeek 云端部署,释放无限 AI 潜力!
  • 【C语言】内存管理
  • JavaFX - 3D 形状
  • 如何使用 ChatBox AI 简化本地模型对话操作
  • ROS-激光雷达模块学习[粗]
  • 算法随笔_35: 每日温度
  • kamailio-ACC_JSON模块详解【后端语言go】
  • 数据结构(1)——算法时间复杂度与空间复杂度
  • 4. 劲舞团python解法——2024年省赛蓝桥杯真题
  • Kafka分区策略实现
  • 有没有个性化的UML图例
  • DevEco Studio的previewer一直转圈缓冲无法打开
  • 高性能消息队列Disruptor
  • 使用 Spring JDBC 进行数据库操作:深入解析 JdbcTemplate
  • dfs枚举问题
  • 【深度学习】softmax回归的从零开始实现
  • 想学习JAVA编程,请问应该如何去学习?
  • 深度学习之“线性代数”
  • DeepSeek超越ChatGPT的能力及部分核心原理
  • 算法【多重背包】
  • 【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(一)
  • 记7(激活函数+多层神经网络+梯度下降法及其优化