掌握基于角色的授权:使用专家策略保护您的 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 保持安全、可扩展且易于维护。无论您构建的是小型应用程序还是企业级系统,基于角色的授权都能提供有效保护资源所需的灵活性。
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。