
在构建现代 restful api 时,安全性是不可或缺的一环。通常,这涉及使用外部授权服务器(如 aws cognito、asgardeo 或其他符合 oauth 2.0/openid connect 规范的服务)来颁发和验证访问令牌。对于许多后端开发者而言,核心需求是构建一个“资源服务器”,它能够验证每个传入请求中的 authorization 头(通常包含 bearer 访问令牌),并根据令牌的有效性决定是否允许访问。
在 Spring Boot 等框架中,通过引入特定的 starter 依赖并进行少量配置,即可轻松实现这种纯资源服务器模式。然而,对于刚接触 C# .NET 的开发者,可能会发现相关教程往往与用户管理紧密耦合,难以找到一个简洁的、专注于令牌验证的解决方案。本教程将展示如何在 C# .NET 应用程序中,以最少的配置实现这一目标。
本解决方案基于 .NET 6.0 或更高版本,利用 ASP.NET Core 内置的认证和授权机制。
首先,在应用程序的 Program.cs 文件中(或 Startup.cs 的 ConfigureServices 方法中),需要添加认证服务并指定 JWT Bearer 认证方案。这是配置外部授权服务器集成最关键的一步。
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
var builder = WebApplication.CreateBuilder(args);
// 添加认证服务
builder.Services.AddAuthentication(options =>
{
// 将 JWT Bearer 设置为默认的认证和挑战方案
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
// 配置 JWT Bearer 选项
// Audience (受众) 是验证令牌的接收方,通常是你的客户端ID或API标识符
options.Audience = "<client_id_或_API_标识符>";
// MetadataAddress (元数据地址) 是OpenID Connect发现端点,
// JWT Bearer 中间件将从此端点自动获取公钥(JWKS)、颁发者(Issuer)等信息
options.MetadataAddress = "https://api.asgardeo.io/t/<app_name>/oauth2/token/.well-known/openid-configuration";
// 如果你的授权服务器不提供标准的.well-known/openid-configuration,
// 或者需要更精细的控制,你可以手动指定Issuer和IssuerSigningKeyResolver等。
// 例如:
// options.Authority = "https://api.asgardeo.io/t/<app_name>/oauth2/token"; // 颁发者地址
// options.TokenValidationParameters = new TokenValidationParameters
// {
// ValidateIssuer = true,
// ValidIssuer = "https://api.asgardeo.io/t/<app_name>/oauth2/token",
// ValidateAudience = true,
// ValidAudience = "<client_id_或_API_标识符>",
// ValidateLifetime = true,
// ValidateIssuerSigningKey = true,
// // IssuerSigningKeyResolver 可以用于动态获取签名密钥
// // IssuerSigningKeyResolver = (token, securityToken, kid, parameters) => ...
// };
});
// 添加控制器服务
builder.Services.AddControllers();
// ... 其他服务配置关键配置项解释:
配置完服务后,需要在应用程序的 HTTP 请求处理管道中启用认证和授权中间件。这些中间件必须按照正确的顺序添加。
var app = builder.Build(); // ... 其他中间件配置 (如 UseHttpsRedirection, UseRouting等) // 必须在 UseRouting 之后、UseEndpoints 之前调用 app.UseAuthentication(); // 启用认证中间件,负责解析请求中的认证信息(如JWT令牌) app.UseAuthorization(); // 启用授权中间件,根据认证信息决定是否允许访问资源 app.MapControllers(); // 将控制器映射到路由 app.Run();
顺序的重要性:
最后一步是在控制器或具体的 Action 方法上应用 [Authorize] 属性。这会指示 ASP.NET Core 要求请求必须经过认证和授权才能访问该端点。
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("[controller]")]
public class MySecuredController : ControllerBase
{
[HttpGet]
[Route("Private")]
[Authorize] // 标记此Action方法需要授权
public IActionResult Private()
{
// 如果请求到达这里,说明已经成功通过认证和授权
return Ok(new
{
Message = "Hello from a private endpoint. You are authorized!"
});
}
[HttpGet]
[Route("Public")]
public IActionResult Public()
{
// 此Action方法无需授权即可访问
return Ok(new
{
Message = "Hello from a public endpoint."
});
}
}当客户端向 /MySecured/Private 端点发送请求时,如果请求头中不包含有效的 Bearer 令牌,或者令牌无效,ASP.NET Core 将返回 401 Unauthorized 状态码。如果令牌有效,请求将正常处理。
通过上述步骤,你可以在 C# .NET 应用程序中轻松实现一个纯资源服务器,利用外部授权服务器的 JWT Bearer 令牌来保护你的 REST API。这种方法简洁高效,避免了不必要的复杂性,使得开发者能够专注于业务逻辑,同时确保 API 的安全性。这种配置方式与 Spring Boot 中使用 spring-boot-starter-oauth2-resource-server 的体验非常相似,提供了极简的集成方案。
以上就是在 C# .NET 中使用外部授权服务器保护 REST API:极简配置指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号