前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ASP.NET JWT认证失败响应:从默认到自定义的优雅改造

ASP.NET JWT认证失败响应:从默认到自定义的优雅改造

作者头像
郑子铭
发布于 2025-04-04 02:21:45
发布于 2025-04-04 02:21:45
14401
代码可运行
举报
运行总次数:1
代码可运行

本文主要介绍如何通过ASP.NET Core的JwtBearerEvents机制,实现JWT认证失败响应的深度定制。

1. 背景

在之前的文章《一个简单的ASP.NET一致性返回工具库》 中,我们介绍了 Sang.AspNetCore.CommonLibraries 这一通用库,它通过统一API响应模型和标准化的提示页面,显著提升了ASP.NET Core项目的开发效率。然而,当项目集成JWT(JSON Web Token)认证时,默认的授权失败响应(401/403状态码+www-authenticate头)可能与团队约定的“业务状态码优先”规则产生冲突。

例如,某些团队要求所有接口必须返回HTTP 200状态码,并通过自定义的status字段(如401表示未授权)标识业务状态。这种“200派”风格虽然违背了HTTP语义的纯粹性,却在某些前后端协作场景中广泛存在。本文将探讨如何利用ASP.NET Core的 JwtBearerEvents 机制,实现JWT认证失败响应的深度定制。

派别之争

2. 默认响应

ASP.NET Core的JWT认证模块严格遵循RFC 6750规范。当Token验证失败时,默认行为如下:

401 Unauthorized:表示未提供有效Token(如未登录)。•403 Forbidden:表示Token有效但权限不足。•www-authenticate:携带错误类型(如error="invalid_token")和详情(如error_description)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
content-length: 0
connection: close
date: Thu, 16 Jan 2025 09:38:23 GMT
server: Kestrel
www-authenticate: Bearer error="invalid_token", error_description="The token expired at '01/15/2025 21:18:12'"

无 AccessToken:

默认响应
默认响应

默认响应

Token验证失败:

默认响应
默认响应

默认响应

Token过期:

默认响应
默认响应

默认响应

这种设计对遵循HTTP标准的前端拦截器非常友好。例如,前端可通过检查状态码和www-authenticate头获取更多的有效信息,或是根据状态码情况统一跳转登录页或提示权限不足。

无可否认,默认的已经足够优秀,但在特定场景下,我们可能需要对其进行定制化改造。比如与“200派”的冲突,若团队强制要求所有接口返回HTTP 200,并通过status字段标识状态(如status=401),默认的401/403响应会破坏这种约定。

3. 自定义响应:实战改造

这里我们需要使用的核心武器是 JwtBearerEvents ,ASP.NET Core的JWT认证模块提供了JwtBearerEvents事件钩子,允许在以下场景中拦截请求并自定义响应:

OnAuthenticationFailed:Token解析失败(如过期、签名错误)。•OnChallenge:请求未携带Token或Token无效。•OnForbidden:Token有效但权限不足。

以下示例展示如何通过事件处理,将所有认证失败响应格式化为HTTP 200 + JSON结构:

代码语言:javascript
代码运行次数:1
运行
AI代码解释
复制
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)  
    .AddJwtBearer(options =>  
    {  
        // 省略TokenValidationParameters配置...  

        options.Events = new JwtBearerEvents  
        {  
            OnAuthenticationFailed = context =>
            {
                context.Response.StatusCode = 200;
                context.Response.ContentType = "application/json";
                return context.Response.WriteAsJsonAsync(new { status = 401, msg = "请重新登录" });
                if (context.Exception is SecurityTokenExpiredException)
                {
                    return context.Response.WriteAsJsonAsync(new { status = 401, msg = "Token 已过期" });
                }
                else if (context.Exception is SecurityTokenInvalidSignatureException)
                {
                    return context.Response.WriteAsJsonAsync(new { status = 401, msg = "Token 签名无效" });
                }
                else
                {
                    return context.Response.WriteAsJsonAsync(new { status = 401, msg = "Token 验证失败" });
                }
            },
            OnChallenge = context =>
            {
                context.HandleResponse();
                if (!context.Response.HasStarted)
                {
                    context.Response.StatusCode = 200;
                    context.Response.ContentType = "application/json";
                    return context.Response.WriteAsJsonAsync(new { status = 401, msg = "未登录" });
                }
                return Task.CompletedTask;
            },
            OnForbidden = context =>
            {
                context.Response.StatusCode = 200;
                context.Response.ContentType = "application/json";
                return context.Response.WriteAsJsonAsync(new { status = 403, msg = "无权限访问" });
            }
        };  
    });  

如果你想在token过期时返回跟多的信息,比如token的过期时间,可以在OnAuthenticationFailed事件中的 content.Exception.Message 中获取更多的信息。

错误详情
错误详情

错误详情

4. 最后

在ASP.NET Core中,JWT认证的默认响应设计足够优秀,但在特定场景下,通过JwtBearerEvents的灵活扩展,我们依然能实现“优雅的妥协”。无论是坚持HTTP语义的纯粹性,还是向业务现实低头,关键在于选择最适合团队协作和技术栈的方案。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ASP.NET Core 中的 JWT 鉴权实现
在当今的软件开发中,安全性和用户认证是至关重要的方面。JSON Web Token(JWT)作为一种流行的身份验证机制,因其简洁性和无状态特性而被广泛应用于各种应用中,尤其是在 ASP.NET Core 项目里。本文将详细介绍如何在 ASP.NET Core 应用中实现 JWT 鉴权,确保应用能够安全地验证用户身份并授权访问特定资源。
郑子铭
2025/03/10
3860
ASP.NET Core 中的 JWT 鉴权实现
自定义AuthorizeAttribute
网站的权限判断是一个非常普遍的需求,从文章ASP.NET MVC的Action Filter中我们知道实现这样的需求只要从AuthorizeAttribute集成,重写相关的判断逻辑就可以了。这里记录一下: namespace TokenAcl.Web.Helper {     public class TokenAclAuthorizeAttribute : AuthorizeAttribute     {         protected override bool AuthorizeCore
张善友
2018/01/19
8650
ASP.NET Core 使用 JWT 自定义角色/策略授权需要实现的接口
可以把授权访问的 API 存放到 Token 中,Token 也可以只存放角色信息和用户身份信息。
痴者工良
2021/04/26
2.8K0
.net core webapi jwt 更为清爽的认证 ,续期很简单(1)
jwt认证分为两部分,第一部分是加密解密,第二部分是灵活的应用于中间件,我的处理方式是将获取token放到api的一个具体的controller中,将发放token与验证分离,token的失效时间,发证者,使用者等信息存放到config中。
FreeTimeWorker
2020/08/31
1.3K0
.net core webapi jwt 更为清爽的认证 ,续期很简单(1)
【ASP.NET Core 基础知识】--中间件--创建自定义中间件
自定义中间件为开发人员提供了更大的灵活性和控制权,使他们能够更好地定制和优化ASP.NET Core应用程序的请求处理流程,满足特定的业务和性能需求。
喵叔
2024/01/17
4370
ASP.NET Core集成现有系统认证
我们现在大多数转向ASP.NET Core来使用开发的团队,应该都不是从0开始搭建系统,而是老的业务系统已经在运行,ASP.NET Core用来开发新模块。那么解决用户认证的问题,成为我们的第一个拦路虎。本文将给大家简单阐述一下认证与授权的基本概念,以及基于ASP.NET Core 中间件实现的认证和改造JwtBearer 认证中间件来实现的认证达到与老系统(主要是token-based认证)的集成。 目录 认证与授权 什么是认证 何谓授权 用Middleware拦截 定制JWT Bearer 认证 更
用户1153966
2018/03/14
2.9K0
ASP.NET Core集成现有系统认证
FastAPI(59)- 详解使用 OAuth2PasswordBearer + JWT 认证
需要安装 python-jose 来在 Python 中生成和验证 JWT token
小菠萝测试笔记
2021/10/09
1.9K0
FastAPI(59)- 详解使用 OAuth2PasswordBearer + JWT 认证
【.NET Core 3.0】 46 ║ 授权认证:自定义返回格式
言归正传,曾几何时,在某微信群讨论 Http 状态码的时候,被某大佬给怼了一下,具体的内容就不说了,反正现在的返回状态码无非就那两个方案,一个是用 RESTFul 风格,完全通过 http状态码来处理,另一个就是通过 自定义返回内容,比如json的格式,把状态信息放到返回内容里边,最终我没有听从他的意见,还是坚持我自己的风格(状态码+自定义格式),具体的内容我都会在下面详细的说明的,恰逢QQ群里有一个小伙伴也说到了关于封装状态码的问题,其实我已经写了,只不过他的更优雅,更漂亮,所以我就用他的方案了:
老张的哲学
2022/04/11
7290
【.NET Core 3.0】 46 ║ 授权认证:自定义返回格式
.net core webapi jwt 更为清爽的认证 ,续期很简单(2)
.net core webapi jwt 更为清爽的认证 后续:续期以及设置Token过期
FreeTimeWorker
2020/08/31
9750
.net core 自定义规范响应的中间件
在本文中,我们将介绍如何使用 .NET Core 中的中间件来自定义规范响应,以便在 API 调用时返回统一的格式和错误信息。中间件是一种可以在请求和响应管道中执行逻辑的软件组件,它可以对请求或响应进行修改、拦截或处理。我们将使用一个简单的示例来演示如何创建和使用自定义规范响应的中间件。
郑子铭
2023/08/29
4940
.net core 自定义规范响应的中间件
基于.NetCore开发博客项目 StarBlog - (32) 第一期完结
StarBlog 项目从 2022 年开始至今已经 2 年多了,本来早就该给第一期做个小结的,但这种博客类型的项目,一旦稳定能用之后,我就没多大的动力去更新了 😂
郑子铭
2025/01/07
1750
基于.NetCore开发博客项目 StarBlog - (32) 第一期完结
ASP.NET Core 实战:基于 Jwt Token 的权限控制全揭露
  在涉及到后端项目的开发中,如何实现对于用户权限的管控是需要我们首先考虑的,在实际开发过程中,我们可能会运用一些已经成熟的解决方案帮助我们实现这一功能,而在 Grapefruit.VuCore 这个项目中,我将使用 Jwt 的方式实现对于用户的权限管控,在本章中,我将演示如何使用 Jwt 实现对于用户的授权、鉴权。
程序员宇说
2019/09/11
2.5K0
ASP.NET Core 实战:基于 Jwt Token 的权限控制全揭露
.Net Core系列教程(五)—— Token Base身份认证
在ASP.Net Core中实现一个Token Base身份认证,使用场景主要就是Web API下,可以调用Web API的不止是浏览器,还有各种各样的客户端,有些客户端没有Cookies,也无法使用Session。这时候就需要Token来救场了,相比Cookies,Token更开放,而安全性也要比Cookies高很多。
徐大嘴
2019/03/21
4.6K0
.Net Core系列教程(五)—— Token Base身份认证
【 .NET Core 3.0 】框架之五 || JWT权限验证
这里一共三个文章,目前是第一篇,剩下两篇主要是在博客园,大家点击阅读原文,自行查看就行。
老张的哲学
2022/04/10
2.3K0
【 .NET Core 3.0 】框架之五 || JWT权限验证
ASP.NET Core 中jwt授权认证的流程原理
那么,如何使用 C# 的 HttpClient 访问一个 JWT 认证的 WebAPI 呢?
痴者工良
2021/04/26
2.7K0
在ASP.NET Core使用Middleware模拟Custom Error Page功能
在传统的ASP.NET MVC中,我们可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了HandleErrorAttribute特性,那么默认的,当这个Action抛出了异常时MVC将会显示Error视图,该视图位于~/Views/Shared目录下。
yoyofx
2018/09/05
1.3K0
[ASP.NET MVC] 利用自定义的AuthenticationFilter实现Basic认证
很多情况下目标Action方法都要求在一个安全上下文中被执行,这里所谓的安全上下文主要指的是当前请求者是一个经过授权的用户。授权的本质就是让用户在他许可的权限范围内做他能够做的事情,授权的前提是请求者是一个经过认证的用户。质询-应答(Chanllenge-Response)”是用户认证采用的一种常用的形式,认证方向被认证方发出质询以要求其提供用于实施认证的用户凭证,而被认证方提供相应的凭证以作为对质询的应答。旨在目标Action方法执行之前实施身分认证的AuthenticationFilter也对这种认证方
蒋金楠
2018/01/15
1.2K0
[ASP.NET MVC] 利用自定义的AuthenticationFilter实现Basic认证
ASP.NET Core 集成 React SPA 应用
AgileConfig的UI使用react重写快完成了。上次搞定了基于jwt的登录模式(AntDesign Pro + .NET Core 实现基于JWT的登录认证),但是还有点问题。现在使用react重写后,agileconfig成了个确确实实的前后端分离项目。那么其实部署的话要分2个站点部署,把前端build完的静态内容部署在一个网站,把server端也部署在一个站点。然后修改前端的baseURL让spa的api请求都指向server的网站。 这样做也不是不行,但是这不符合AgileConfig的精神,那就是简单。asp.net core程序本身其实就是一个http服务器,所以完全可以把spa网站使用它来承载。这样只需要部署一个站点就可以同时跑spa跟后端server了。 其实最简单的办法就是把build完的文件全部丢wwwroot文件夹下面。然后访问:
MJ.Zhou
2021/03/27
9620
【ASP.NET Core 基础知识】--Web API--Swagger文档生成
Swagger是一种用于设计、构建和文档化Web API的开源工具。它提供了一套标准化的规范,使得开发者能够清晰地定义API端点、参数、请求和响应。通过Swagger,用户可以生成具有交互式UI的实时API文档,便于团队协作和第三方开发者理解和使用API。它支持多种编程语言和框架,并提供了丰富的功能,如自动生成代码、请求示例和测试用例。Swagger的目标是简化API开发流程,提高文档质量,并促进开发者、测试人员和其他利益相关方之间的沟通。 Swagger文档在Web API开发中具有重要性,体现在以下几个方面:
喵叔
2024/05/24
1.2K0
ASP.NET Core 6框架揭秘实例演示[33]:异常处理高阶用法
NuGet包“Microsoft.AspNetCore.Diagnostics”中提供了几个与异常处理相关的中间件,我们可以利用它们将原生的或者定制的错误信息作为响应内容发送给客户端。《错误页面的N种呈现方式》演示了几个简单的实例使读者大致了解这些中间件的作用,现在我们来演示几个高阶用法。本文提供的示例演示已经同步到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2022/09/23
1.3K0
ASP.NET Core 6框架揭秘实例演示[33]:异常处理高阶用法
推荐阅读
相关推荐
ASP.NET Core 中的 JWT 鉴权实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验