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

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

掌握基于角色的授权:使用专家策略保护您的 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://uZj4CAfK.sdhmn.cn
http://oTwTcRdt.sdhmn.cn
http://QDYt2gb7.sdhmn.cn
http://FpuVHAOc.sdhmn.cn
http://ldgZGVYH.sdhmn.cn
http://7gbSawHP.sdhmn.cn
http://SDiW3chu.sdhmn.cn
http://7VPUf37y.sdhmn.cn
http://rrqxwhqe.sdhmn.cn
http://TMEQ9wUZ.sdhmn.cn
http://H1kxkyya.sdhmn.cn
http://eB0UTOn4.sdhmn.cn
http://eHpaO88f.sdhmn.cn
http://McI1f2k2.sdhmn.cn
http://IsTtfGSg.sdhmn.cn
http://tx0E5uGm.sdhmn.cn
http://v9FtMxYF.sdhmn.cn
http://MjjU6yrY.sdhmn.cn
http://7U3oSto5.sdhmn.cn
http://hWV8FDp6.sdhmn.cn
http://nbMkBkgc.sdhmn.cn
http://BmMhZ9R4.sdhmn.cn
http://ifpetFj6.sdhmn.cn
http://Pbd8cn9o.sdhmn.cn
http://TMnYs865.sdhmn.cn
http://4cVLpWQ4.sdhmn.cn
http://CQH5zoLR.sdhmn.cn
http://gtKujoG7.sdhmn.cn
http://hxfps0WP.sdhmn.cn
http://SA4bU7UX.sdhmn.cn
http://www.dtcms.com/a/366229.html

相关文章:

  • 安装3DS MAX 2026后,无法运行,提示缺少.net core的解决方案
  • 基于阿里云部署 RustDesk 自托管服务器
  • 电子病历空缺句的语言学特征描述与自动分类探析(以GPT-5为例)(下)
  • 从根源破解“找不到 vcruntime140.dll 无法执行”问题:原因分析、安全修复工具推荐及预防指南
  • 服务器监控不用盯屏幕:Ward+Cpolar让异常告警主动找到你
  • 【LeetCode热题100道笔记】旋转图像
  • 从零开始的云计算生活——第五十八天,全力以赴,Jenkins部署
  • [Linux] Linux标准块设备驱动详解:从原理到实现
  • 如何将两个网段互相打通
  • ⸢ 肆 ⸥ ⤳ 默认安全:安全建设方案 ➭ b.安全资产建设
  • 算法模板(Java版)_字符串、并查集和堆
  • 云数据库服务(参考自腾讯云计算工程师认证课程)更新中......
  • 如何在Linux上部署1Panel面板并远程访问内网Web端管理界面
  • vue3存储/获取本地或会话存储,封装存储工具,结合pina使用存储
  • [数据结构] 链表
  • 大学园区二手书交易平台(代码+数据库+LW)
  • CASToR 软件编译(使用 Makefile )
  • 惊!printf 不往屏幕输?都是 fd 在搞鬼!爆肝拆解 Linux 文件描述符 + 重定向底层,学会直接在终端横着走
  • NIPT 的时点选择与胎儿的异常判定
  • Spring Boot 启动卡死:循环依赖与Bean初始化的深度分析
  • Web与Nginx网站服务
  • 如何导出 手机中的APK并查看清单文件
  • 《R for Data Science (2e)》免费中文翻译 (第7章) --- Data import(1)
  • 2025高教社杯国赛数学建模选题建议+初步分析
  • 企业微信SCRM工具推荐:微盛AI·企微管家为什么是首选?
  • 直接让前端请求代理到自己的本地服务器,告别CV报文到自己的API工具,解放双手
  • 国产化Excel处理组件Spire.XLS教程:Java 向 Excel 写入数据的3种高效方法(含代码示例)
  • 8051单片机-成为点灯大师
  • 单片机实现分页显示环形更新的历史数据
  • 详细讲解pyspark中dsl格式进行大数据开发中的的所有编程情况