掌握基于角色的授权:使用专家策略保护您的 ASP.NET Core 8 Web API。

在 ASP.NET Core 8 Web API 中实现基于角色的授权:安全且可扩展 API 的最佳实践

介绍

授权是任何 Web 应用程序的关键组件。在开发 API 时,使用基于角色的授权保护端点可确保具有特定角色的用户只能访问应用程序的相关部分。在 ASP.NET Core 8 中,基于角色的授权更易于实现、更加灵活,并且符合现代最佳实践。在本指南中,我们将逐步介绍在ASP.NET Core 8 Web API中实现基于角色的授权的步骤,重点介绍其独特功能,包括 .NET 8 中无需Startup.cs文件授权的特性。

无论您是希望保护第一个 API 的初学者,还是旨在应用最佳实践的经验丰富的开发人员,本综合指南都将帮助您构建安全且可扩展的 Web API。

为什么要基于角色授权?

基于角色的授权允许您根据用户的角色控制对资源的访问。这在以下场景中特别有用:

    • 只有管理员才具有完全访问权限的管理面板。
• 基于订阅的服务,根据用户的计划授予不同级别的访问。
• 多租户应用程序中,来自不同组织的用户具有不同的权限。

在 ASP.NET Core 8 中,基于角色的授权建立在 Identity 框架之上,以提供对访问权限的细粒度控制。

ASP.NET Core 8 有哪些新功能?

.NET 8 中的一些结构性变化值得关注,尤其是文件的移除Startup.cs。依赖注入 (DI) 配置现在直接在Program.cs文件中处理,简化了设置过程。此更改简化了项目配置,并鼓励开发人员采用更加模块化的方法。

在 ASP.NET Core 8 中实现基于角色的授权的步骤

1. 设置 ASP.NET Core 8 Web API 项目

首先,使用以下命令创建一个新的 ASP.NET Core 8 Web API 项目:

dotnet new webapi -n RoleBasedAuthAPI
cd RoleBasedAuthAPI

项目创建后,安装Identity和Entity Framework Core所需的 NuGet 包:

dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.SqlServer

这些包将帮助我们管理用户角色和数据库访问。

2. 配置服务Program.cs

由于 .NET 8 不再使用Startup.cs,所有配置均在 中完成Program.cs。以下是配置身份和授权服务的方法:

var builder = WebApplication.CreateBuilder(args);

// Adding EF Core with SQL Server
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

// Adding Identity services
builder.Services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();

// Adding Authentication and Authorization
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = builder.Configuration["Jwt:Issuer"],
ValidAudience = builder.Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
};
});

builder.Services.AddAuthorization(options =>
{
options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin"));
options.AddPolicy("UserOnly", policy => policy.RequireRole("User"));
});

var app = builder.Build();

在AddAuthorization方法中,我们定义基于角色的策略,例如“AdminOnly”和“UserOnly”,根据用户的角色限制对某些操作的访问。

3. 在 ASP.NET Core 中定义用户角色

接下来,我们需要在应用程序中创建角色。这可以在应用程序启动时使用角色播种器来完成。将以下代码添加到新类中RoleSeeder.cs:

public static class RoleSeeder
{
public static async Task SeedRolesAsync(RoleManager<IdentityRole> roleManager)
{
if (!await roleManager.RoleExistsAsync("Admin"))
{
await roleManager.CreateAsync(new IdentityRole("Admin"));
}

        if (!await roleManager.RoleExistsAsync("User"))
{
await roleManager.CreateAsync(new IdentityRole("User"));
}
}
}

在 中Program.cs,在应用程序启动期间调用此播种机:

var roleManager = app.Services.GetRequiredService<RoleManager<IdentityRole>>();
await RoleSeeder.SeedRolesAsync(roleManager);

4. 使用角色保护端点

有了角色,我们就可以将它们应用到控制器操作中。例如,你可以AdminController使用以下Authorize属性来保护端点:

[Authorize(Policy = "AdminOnly")]
[ApiController]
[Route("api/[controller]")]
public class AdminController : ControllerBase
{
[HttpGet("dashboard")]
public IActionResult GetAdminDashboard()
{
return Ok("Welcome to the Admin Dashboard!");
}
}

现在只有具有“管理员”角色的用户才能执行此操作。

5.创建具有角色的用户

你可以通过修改注册逻辑,在用户注册时为其分配角色。例如,如果你有一个用户注册端点,则可以默认分配“用户”角色:

[HttpPost("register")]
public async Task<IActionResult> Register([FromBody] RegisterModel model)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await _userManager.CreateAsync(user, model.Password);

    if (result.Succeeded)
{
await _userManager.AddToRoleAsync(user, "User");
return Ok("User registered successfully");
}

    return BadRequest("Registration failed");
}

这可确保新用户在注册时自动分配“用户”角色。

ASP.NET Core 8 中基于角色的授权最佳实践

1、直接使用策略而非角色:虽然直接使用策略方法很诱人RequireRole,但策略提供了更大的灵活性。例如,您可以创建需要多个角色或其他条件的策略,从而使授权逻辑更易于维护。

2、通过身份验证和授权来保护 API 端点:始终将基于角色的授权与适当的身份验证机制(如 JWT 令牌)相结合,以确保 API 免受未经授权的访问。

3、保持敏感端点隔离:避免将敏感的管理操作与一般用户操作混合。隔离管理员和用户控制器,以实现更好的安全管理。

4、实施日志记录和审计:对于安全敏感的应用程序,必须记录对关键端点的访问并定期检查这些日志,以确保没有未经授权的访问尝试。

5、定期更新角色和权限:随着应用程序的增长,用户角色可能需要更新。确保您已建立修改角色和权限的流程。

总结

基于角色的授权是保护 API 安全的强大工具,而 ASP.NET Core 8 的出现,让授权过程变得前所未有的简单。遵循这些最佳实践,您可以确保 API 保持安全、可扩展且易于维护。无论您构建的是小型应用程序还是企业级系统,基于角色的授权都能提供有效保护资源所需的灵活性。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96058.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96058.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/96058.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AutoHotkey识别图片

一、下载ImagePut插件 下载地址&#xff1a;GitHub - iseahound/ImagePut: A core library for images in AutoHotkey. Supports AutoHotkey v1 and v2. 二、将插件和要搜索的图片导入项目 #Include ./plugin/ImagePut.ahk ; 截取当前屏幕 pic : ImagePutBuffer(0) point : p…

CamX-Camera常用编译命令和adb指南

g_camxsettings vendor/qcom/proprietary/camx/src/settings/g_camxsettings.xml 控制相机debug的信息都在该文件里面 0、相关代码 framwork层 frameworks/av/camera/ frameworks/av/services/camera frameworks/av/services/camera frameworks/hardware/interfaces/camerase…

LabVIEW 实现颜色平滑渐变控制

LabVIEW 中实现 LED 颜色从蓝到红的平滑渐变显示在 LabVIEW 开发中&#xff0c;若需让 LED&#xff08;或类 LED 显示控件&#xff09;实现从蓝色到红色的平滑色彩渐变&#xff08;模拟温度等参数从低到高的视觉反馈&#xff09;&#xff0c;可通过自定义颜色查找表 数值缩放映…

阴阳学:从入门到精通

第一篇&#xff1a;入门篇——阴阳基础理论1.1 阴阳的起源与哲学意义阴阳概念的历史渊源《易经》中的阴阳思想阴阳与宇宙、自然、人生的关系阴阳对思想、行为、社会的影响1.2 阴阳的基本属性与符号阴阳的特征、象征与对立统一阴阳在自然界的表现&#xff08;昼夜、冷热、动静等…

Java工业通信实战(三):Modbus RTU串口通信实现

想象一下&#xff0c;你要和一台工业设备"对话"&#xff0c;比如询问温度传感器"现在多少度&#xff1f;“或者告诉电机"转快一点”。 Modbus RTU就是这种"对话"的标准语言&#xff0c;就像人与人之间说普通话一样。 它采用主从结构&#xff0c;…

CentOS安装或升级protoc

卸载旧版本 sudo yum remove protobuf protobuf-c protobuf-compiler -y sudo rm -f /usr/bin/protoc sudo rm -rf /usr/include/google/protobuf 下载 wget https://github.com/protocolbuffers/protobuf/releases/download/v3.15.0/protoc-3.15.0-linux-x86_64.zip unz…

人工智能在医学图像中的应用:从机器学习到深度学习

目的&#xff1a;人工智能&#xff08;AI&#xff09;模型在生物医学研究和医疗服务中扮演着越来越重要的角色。本综述聚焦于在现实世界背景下&#xff0c;开发AI应用作为临床决策支持系统时需要澄清的挑战性问题。方法&#xff1a;进行了一项叙述性综述&#xff0c;包含对1989…

基于Echarts+HTML5可视化数据大屏展示-智慧小区大数据分析

效果展示&#xff1a;代码结构&#xff1a;主要代码实现 index.html布局 <!doctype html> <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8"><title>智慧农业大数据展示</title><link rel"s…

【LeetCode热题100道笔记】验证二叉搜索树

题目描述 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 严格小于 当前节点的数。 节点的右子树只包含 严格大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例 1&…

Apache Tomcat 教程:从入门到精通(含目录结构与版本详解)

​​​​​​1. 背景​​ Apache Tomcat 是一个开源的 ​​Java Servlet 容器​​&#xff0c;由 ​​Apache 软件基金会&#xff08;ASF&#xff09;​​ 开发和维护&#xff0c;最初由 ​​Sun Microsystems​​ 的软件架构师 ​​James Duncan Davidson​​ 设计&#xff0…

设计模式从入门到精通之(六)策略模式

策略模式&#xff1a;让算法灵活切换的秘密武器在日常开发中&#xff0c;算法的选择常常是程序设计的核心&#xff0c;比如支付方式的选择、排序逻辑的切换、促销活动的动态调整等。当需求变化时&#xff0c;我们需要在多个算法之间切换&#xff0c;但又不希望修改已有代码。如…

安装MATLAB205软件记录

安装MATLAB2025 一台电脑可以安装多个版本的MATLAB; 下载资源 微信公众平台-MATLAB R2025a v25.1下载及安装教程 安装步骤 解压, 压缩文件大小为13.8GB 装载 选中setup.exe右键单击以管理员身份运行 我有文件安装密钥 接受许可条款 复制粘贴密钥 63733-59078-50866-02827-…

MySQL 基础架构(一):SQL语句的执行之旅

MySQL系列文章 MySQL 基础架构&#xff08;一&#xff09;&#xff1a;SQL语句的执行之旅 你是否好奇过&#xff0c;一条看似简单的SQL查询语句&#xff0c;在MySQL内部究竟经历了怎样的"奇幻之旅"&#xff1f;从连接建立到结果返回&#xff0c;MySQL是如何层层处理、…

Spring Boot 使用 Druid 连接池极致优化

在 Spring Boot 中使用 Druid 连接池进行极致优化&#xff0c;需要从核心参数调优、监控体系搭建、安全增强、连接管理及性能适配等多个维度综合考虑。以下是分阶段的详细优化策略&#xff1a;一、基础环境准备确保使用最新稳定版 Druid&#xff08;截至 2024 年推荐 1.2.38&am…

【Big Data】Apache Kafka 分布式流处理平台的实时处理实践与洞察

目录 一、Apache Kafka是什么 二、Kafka的诞生背景 三、Kafka的架构设计 四、Kafka解决的技术问题 五、Kafka的关键特性 六、Kafka与其他消息队列系统的对比 七、Kafka的工作原理 八、Kafka的部署与使用方法 1. 集群部署 2. 生产者与消费者配置 3. 安全配置 4. 监控…

23种设计模式——装饰器模式(Decorator Pattern)详解

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a;设计模式 ✨特色专栏&#xff1a;知识分享 &#x…

《sklearn机器学习——聚类性能指标》Davies-Bouldin Index (戴维斯-博尔丁指数)

Davies-Bouldin Index (戴维斯-博尔丁指数)简介 概念与定义 Davies-Bouldin Index是由David L. Davies和Donald W. Bouldin于1979年提出的一种用于评估聚类算法效果的内部指标。它通过计算每个簇内数据点之间的相似性和不同簇中心点的距离来衡量聚类结果的质量。DBI的值越低&am…

QT的学习(一)

前言&#xff1a;距离上一次摸QT已经快10年了&#xff0c;时光匆匆&#xff0c;现在已经到6.9版本了 一、安装QT 1.1、下载链接 https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/ 这是国内镜像&#xff0c;比官网快很多了&#xff0c;官网那个…

亚洲数字能源独角兽的 “安全密码”:Parasoft为星星充电筑牢软件防线

当你在充电桩前等待爱车满电时&#xff0c;是否想过&#xff1a;这看似简单的充电过程&#xff0c;背后藏着多少软件代码的精密协作&#xff1f;作为亚洲数字能源领域的头部企业&#xff0c;星星充电用 “移动能源网” 连接着千万用户与新能源世界&#xff0c;而支撑这一切的&a…

安装Codex(需要用npm)

查看已经安装的包 npm list -g --depth0 npm uninstall -g anthropic-ai/claude-code 如果要卸载什么东西 安装Codex &#xff1a;npm i -g openai/codex https://openai.com/zh-Hant/codex/ 之后登录gpt账号&#xff0c;完成后就是下面的样子