C# .NET中基于JWT和外部授权服务器的REST API安全配置指南

C# .NET中基于JWT和外部授权服务器的REST API安全配置指南

本文旨在提供一个简洁明了的教程,指导开发者如何在C# .NET应用中,以纯资源服务器模式,通过外部授权服务器(如AWS Cognito或Asgardeo)实现REST API的安全保护。文章将重点介绍如何利用JWT Bearer认证机制,通过最小化配置,快速构建一个能够验证传入访问令牌的API服务,无需深度集成用户管理功能。

核心概念:JWT Bearer认证与资源服务器

在现代微服务架构中,api安全通常通过oauth 2.0和openid connect协议实现,其中json web token (jwt) 作为访问令牌的标准格式。资源服务器(resource server)是托管受保护资源的api服务,其主要职责是验证传入请求中的访问令牌,并根据令牌的有效性和权限信息决定是否授予访问。

对于从Java Spring Boot等其他平台迁移到C# .NET的开发者而言,如何以简洁高效的方式实现REST API的安全保护,尤其是作为纯资源服务器的角色,常常是一个挑战。许多教程倾向于将用户管理与API安全紧密结合,但这并非总是纯资源服务器所需的场景。本教程将展示如何在C# .NET中,通过最小化配置,实现一个专注于令牌验证的资源服务器。

配置步骤

在C# .NET(本示例基于.NET 6.0)中实现JWT Bearer认证的资源服务器,主要涉及以下三个步骤:

1. 添加认证服务

在应用程序的Program.cs文件中,需要配置认证服务,指定使用JWT Bearer认证方案。这包括设置默认的认证和挑战方案,并配置JWT Bearer选项,如受众(Audience)和OpenID Connect元数据地址。

using Microsoft.AspNetCore.Authentication.JwtBearer;using Microsoft.IdentityModel.Tokens;var builder = WebApplication.CreateBuilder(args);// 添加认证服务builder.Services.AddAuthentication(options =>{    // 设置默认的认证方案为JwtBearer    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;    // 设置默认的挑战方案为JwtBearer    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;}).AddJwtBearer(options =>{    // 配置JWT Bearer选项    // Audience (受众) 是验证令牌时检查的声明之一,通常是客户端ID或资源服务器的标识符。    // 它确保令牌是为预期接收者颁发的。    options.Audience = "";     // MetadataAddress (元数据地址) 指向外部授权服务器的OpenID Connect配置发现文档。    // .NET认证中间件将从该地址自动获取公钥(JWKS URI)、颁发者(Issuer)等信息,    // 用于验证JWT令牌的签名和有效性。    options.MetadataAddress = "https://api.asgardeo.io/t//oauth2/token/.well-known/openid-configuration";    // 如果需要更精细的控制,例如自定义令牌验证参数,可以在这里进一步配置TokenValidationParameters。    // options.TokenValidationParameters = new TokenValidationParameters    // {    //     ValidateIssuer = true,    //     ValidIssuer = "https://api.asgardeo.io/t//oauth2/token",    //     ValidateAudience = true,    //     ValidAudience = "",    //     ValidateLifetime = true,    //     ClockSkew = TimeSpan.Zero // 允许的时间偏移量,建议设置为零或较小值    // };});// 其他服务注册,例如添加控制器builder.Services.AddControllers();// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbucklebuilder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen();var app = builder.Build();// Configure the HTTP request pipeline.if (app.Environment.IsDevelopment()){    app.UseSwagger();    app.UseSwaggerUI();}app.UseHttpsRedirection();

请将替换为您的客户端ID,将https://api.asgardeo.io/t//oauth2/token/.well-known/openid-configuration替换为您的外部授权服务器的OpenID Connect发现文档地址。

2. 配置认证与授权中间件

在请求处理管道中,必须按照正确的顺序添加认证和授权中间件。UseAuthentication()负责验证请求的凭据(即JWT令牌),而UseAuthorization()则根据验证结果和端点上定义的授权策略来决定是否允许访问。

琅琅配音 琅琅配音

全能AI配音神器

琅琅配音 208 查看详情 琅琅配音

// ... (之前的代码)app.UseHttpsRedirection();// 启用认证中间件,它会尝试解析并验证传入请求中的JWT令牌。app.UseAuthentication();// 启用授权中间件,它会根据已认证用户的身份和策略来决定访问权限。app.UseAuthorization();// 映射控制器路由,确保在认证和授权之后执行。app.MapControllers();app.Run();

重要提示: UseAuthentication()、UseAuthorization()和MapControllers()的顺序至关重要。认证必须在授权之前发生,而路由映射则应在两者之后,以确保所有请求都能经过认证和授权检查。

3. 保护API端点

最后,通过在控制器或特定的API方法上应用[Authorize]属性,即可轻松保护您的API端点。当请求到达带有此属性的端点时,如果没有有效的JWT令牌或令牌验证失败,ASP.NET Core将返回401 Unauthorized响应。

using Microsoft.AspNetCore.Authorization;using Microsoft.AspNetCore.Mvc;namespace YourAppName.Controllers{    [ApiController]    [Route("[controller]")]    public class WeatherForecastController : ControllerBase    {        private static readonly string[] Summaries = new[]        {            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"        };        private readonly ILogger _logger;        public WeatherForecastController(ILogger logger)        {            _logger = logger;        }        [HttpGet(Name = "GetWeatherForecast")]        public IEnumerable Get()        {            return Enumerable.Range(1, 5).Select(index => new WeatherForecast            {                Date = DateTime.Now.AddDays(index),                TemperatureC = Random.Shared.Next(-20, 55),                Summary = Summaries[Random.Shared.Next(Summaries.Length)]            })            .ToArray();        }        // 添加一个受保护的私有端点        [HttpGet]        [Route("Private")] // 定义该私有端点的路由        [Authorize] // 应用Authorize属性,表示此端点需要认证        public IActionResult Private()        {            // 只有经过认证的用户才能访问此端点            return Ok(new            {                Message = "Hello from a private endpoint. You are authorized!"            });        }    }}

现在,当客户端向/WeatherForecast/Private端点发送请求时,必须在Authorization请求头中包含一个有效的Bearer JWT令牌,否则请求将被拒绝。

注意事项

外部授权服务器配置: 确保您的外部授权服务器(如AWS Cognito、Asgardeo、Auth0等)已正确配置,并且其OpenID Connect发现文档(/.well-known/openid-configuration)可公开访问。客户端类型: 本教程提供的解决方案适用于那些不涉及客户端密钥(Client Secret)的应用场景,例如单页应用(SPA)或移动应用。对于需要客户端密钥的保密客户端(Confidential Client),AddJwtBearer的配置可能需要额外的参数,例如通过Authority直接指定颁发者,或者通过HttpClient配置来处理密钥交换。令牌验证参数: MetadataAddress会自动获取大部分必要的验证参数。然而,如果您的需求特殊,可以通过TokenValidationParameters属性进行更细粒度的控制,例如强制验证颁发者(Issuer)、自定义时钟偏移(Clock Skew)等。错误处理: 对于认证失败的情况,ASP.NET Core默认会返回401 Unauthorized。您可以根据需要实现自定义的错误处理逻辑,例如通过options.Events来捕获认证失败事件。策略授权: [Authorize]属性除了可以简单地要求认证外,还可以结合策略(Policies)进行更复杂的授权控制,例如要求用户拥有特定的角色或声明。

总结

通过上述简洁的配置,您可以在C# .NET应用程序中快速构建一个纯资源服务器,实现基于JWT Bearer令牌的REST API安全。这种方法与Spring Boot中spring-boot-starter-oauth2-resource-server的理念高度一致,允许开发者专注于业务逻辑,而将令牌验证的复杂性交由框架和外部授权服务器处理。这极大地简化了API安全实现的流程,提高了开发效率和系统的可维护性。

以上就是C# .NET中基于JWT和外部授权服务器的REST API安全配置指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/217348.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月3日 15:38:05
下一篇 2025年11月3日 15:38:30

相关推荐

  • 构建模拟:从头开始的实时交易模拟器

    简介 嘿,开发社区!我很高兴分享我的业余项目 Simul8or – 一个实时日间交易模拟器,旨在为用户提供一个无风险的环境来练习交易策略。该项目 100% 构建在 ASP.NET WebForms、C#、JavaScript、CSS 和 SQL Server 技术堆栈上,没有外部库或框架。从头开始构…

    2025年12月24日
    300
  • 花 $o 学习这些编程语言或免费

    → Python → JavaScript → Java → C# → 红宝石 → 斯威夫特 → 科特林 → C++ → PHP → 出发 → R → 打字稿 []https://x.com/e_opore/status/1811567830594388315?t=_j4nncuiy2wfbm7ic…

    2025年12月24日
    000
  • 深入理解CSS框架与JS之间的关系

    深入理解CSS框架与JS之间的关系 在现代web开发中,CSS框架和JavaScript (JS) 是两个常用的工具。CSS框架通过提供一系列样式和布局选项,可以帮助我们快速构建美观的网页。而JS则提供了一套功能强大的脚本语言,可以为网页添加交互和动态效果。本文将深入探讨CSS框架和JS之间的关系,…

    2025年12月24日
    000
  • HTML+CSS+JS实现雪花飘扬(代码分享)

    使用html+css+js如何实现下雪特效?下面本篇文章给大家分享一个html+css+js实现雪花飘扬的示例,希望对大家有所帮助。 很多南方的小伙伴可能没怎么见过或者从来没见过下雪,今天我给大家带来一个小Demo,模拟了下雪场景,首先让我们看一下运行效果 可以点击看看在线运行:http://hai…

    2025年12月24日 好文分享
    500
  • 10款好看且实用的文字动画特效,让你的页面更吸引人!

    图片和文字是网页不可缺少的组成部分,图片运用得当可以让网页变得生动,但普通的文字不行。那么就可以给文字添加一些样式,实现一下好看的文字效果,让页面变得更交互,更吸引人。下面创想鸟就来给大家分享10款文字动画特效,好看且实用,快来收藏吧! 1、网页玻璃文字动画特效 模板简介:使用css3制作网页渐变底…

    2025年12月24日 好文分享
    000
  • css和c的区别是什么

    区别是:1、C语言是一门面向过程、抽象化的通用程序设计语言、计算机编程语言,广泛应用于底层开发;2、CSS是一种用来表现HTML或XML等文件样式的计算机语言,可以做到网页和内容进行分离的一种样式语言。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电…

    2025年12月24日
    000
  • tp5如何引入css文件

    tp5引入css文件的方法:1、将css文件放在public目录下的static文件里即可;2、在页面引入中写上“”语句即可。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。 其实很简单,只需要将css,js,image文件放在这个目录下即可 页…

    2025年12月24日
    000
  • 聊聊CSS 与 JS 是如何阻塞 DOM 解析和渲染的

    本篇文章给大家介绍一下css和js阻塞 dom 解析和渲染的原理。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 hello~各位亲爱的看官老爷们大家好。估计大家都听过,尽量将CSS放头部,JS放底部,这样可以提高页面的性能。然而,为什么呢?大家有考虑过么?很长一段时间,我都是知其…

    2025年12月24日
    200
  • js如何修改css样式

    js修改css样式的方法:1、使用【obj.className】来修改样式表的类名;2、使用【obj.style.cssTest】来修改嵌入式的css;3、使用【obj.className】来修改样式表的类名;4、使用更改外联的css。 本教程操作环境:windows7系统、css3版,DELL G…

    2025年12月24日
    000
  • 如何使用纯CSS、JS实现图片轮播效果

    本篇文章给大家详细介绍一下使用纯css、js实现图片轮播效果的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 .carousel {width: 648px;height: 400px;margin: 0 auto;text-align: center;position: a…

    2025年12月24日
    000
  • js如何修改css

    js修改css的方法:1、使用【obj.style.cssTest】来修改嵌入式的css;2、使用【bj.className】来修改样式表的类名;3、使用更改外联的css文件,从而改变元素的css。 本教程操作环境:windows7系统、css3版,DELL G3电脑。 js修改css的方法: 方法…

    2025年12月24日
    000
  • js如何改变css样式

    js改变css样式的方法:1、使用cssText方法;2、使用【setProperty()】方法;3、使用css属性对应的style属性。 本教程操作环境:windows7系统、css3版,DELL G3电脑。 js改变css样式的方法: 第一种:用cssText div.style.cssText…

    2025年12月24日
    000
  • 为什么css放上面js放下面

    css放上面js放下面的原因:1、在加载html生成DOM tree的时候,可以同时对DOM tree进行渲染,这样可以防止闪跳,白屏或者布局混乱;2、javascript加载后会立即执行,同时会阻塞后面的资源加载。 本文操作环境:Windows7系统、HTML5&&CSS3版,DE…

    2025年12月24日
    000
  • 推荐六款移动端 UI 框架

    作为一个前端人员来说,总结几款相对来说不错的用于移动端开发的UI框架是非常必要的,以下几种移动端UI框架就能基本满足工作中开发需要,根据项目需求,选用合适的框架搭建项目,更能容易提高开发效率。 一、MUI         最接近原生APP体验的高性能前端框架,追求性能体验,是我们开始启动MUI项目的…

    2025年12月24日
    000
  • css如何实现图片的旋转展示效果(代码示例)

    本篇文章给大家带来内容是通过代码示例介绍使用css+js实现图片的旋转展示,制作一个手动操作的“无限”照片轮播图。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 下面我们就开始介绍如何实现效果。 1、构建图像轮播框架 首先是HTML。它有点难以阅读,因为我们删除了元素之间的任何空格…

    2025年12月24日
    000
  • css3+js实现烟花绽放的动画效果(代码示例)

    本篇文章给大家介绍通过js+css3的transforms属性和keyframes属性来实现烟花绽放的动画效果的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 首先我们来看看效果: 动画的实现原理: 动画使用了两个关键帧(keyframes): 一个是烟花筒上升的轨迹,另一个…

    2025年12月24日
    000
  • css+js如何在幻灯片上添加文字?实现幻灯片的旋转切换(附代码)

    本篇文章给大家带来的内容是介绍css+js如何在幻灯片上添加文字?实现幻灯片的旋转切换(附代码)。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 在之前的文章【css如何实现幻灯片效果?幻灯片的实现方法】中介绍了实现淡入淡出幻灯片的实现方法,本篇文章就在其基础上去解释如何在幻灯片上…

    2025年12月24日
    000
  • css+js如何实现简单的动态进度条效果?(代码实例)

    css+js如何实现简单的动态进度条?本篇文章就给大家用css+js制作一个简单的动态进度条效果,并将页面动态进度条滚动加载的代码分享给大家,感兴趣的小伙伴可以参考借鉴一下,希望对你们有所帮助。 我们要知道,这里主要使用了css3的animation动画属性,首先将进度条设置为一个初始宽度为0,背景…

    2025年12月24日
    000
  • 手写CSS+js实现radio单选按钮

    本文给大家介绍手写css+js实现radio单选按钮,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 有的时候我们需要用长得漂亮一点的单选按钮,那么,就要抛弃原有的自己来写,下面就是我实现的 你丑你先你才丑你先你更丑你先 .radio{display: flex;align-ite…

    2025年12月24日
    000
  • css3+js绘制动态时钟(附代码)

    本章给大家介绍如何使用css3与js实现动态时钟效果,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 先看看效果图: 首先,思考了一下页面的布局,大致需要4层div,最底层是一个表盘的背景图,然后其余3层分别是时针,分针,秒针的图层. html代码如下: 变量名是随便起的,不要介意;…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信