You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC 5(非Core)如何接收验证外部传入的JWT以实现支付页面鉴权

ASP.NET MVC 5 接收并校验外部传入JWT的实现方案

针对移动端跳转/WebView加载ASP.NET支付页时传入JWT完成身份鉴权的需求,可通过以下无框架侵入的方案落地:

明确JWT的传入通道

根据移动端的页面加载形式,提前约定统一的JWT传递位置,避免多入口传参混乱:

  • 若移动端通过内置WebView加载支付页:可优先通过自定义请求头Authorization: Bearer <jwt内容>传递,也可通过WebView的前端初始化脚本把JWT注入页面全局变量,由前端JS发起AJAX请求时携带
  • 若移动端通过系统浏览器跳转打开支付页:可通过URL Query参数(如https://你的支付页地址?jwt=xxx)传递,页面加载完成后通过前端history.replaceState清除URL中的JWT字段,避免浏览器历史记录留存敏感信息
  • 若移动端通过POST表单提交跳转支付页:可把JWT作为隐藏表单字段传递

核心校验逻辑实现

MVC 5 没有内置的JWT鉴权中间件,可依托框架自带的过滤器机制实现统一校验,无需改造原有项目架构:

  • 首先安装兼容.NET Framework环境的NuGet包:System.IdentityModel.Tokens.Jwt,该包提供JWT的标准解析、校验能力
  • 自定义继承System.Web.Mvc.AuthorizeAttribute的鉴权过滤器,在OnAuthorization钩子方法中完成全流程处理:
    1. 从约定的传入位置(请求头、Query参数、POST表单字段)读取JWT字符串
    2. 配置和移动端JWT签发端完全一致的校验规则:包括签名密钥、签发者(Issuer)、受众(Audience)、过期时间校验,设置合理的时钟偏移量抵消客户端和服务端的时间差
    3. 校验通过后,将解析得到的Claims身份信息赋值给当前HttpContext的用户对象,后续业务代码可直接读取JWT内的用户ID、账单号、支付金额等业务字段
    4. 校验失败时直接返回401未授权结果,阻断后续业务流程

核心校验逻辑参考代码片段

public class JwtAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        // 按约定位置读取JWT
        string jwtToken = filterContext.HttpContext.Request.Headers["Authorization"]?.Replace("Bearer ", string.Empty);
        if (string.IsNullOrEmpty(jwtToken))
        {
            jwtToken = filterContext.HttpContext.Request.QueryString["jwt"];
        }
        if (string.IsNullOrEmpty(jwtToken))
        {
            filterContext.Result = new HttpUnauthorizedResult();
            return;
        }

        // 配置校验规则,参数与移动端JWT签发端完全匹配
        var securityKey = Encoding.UTF8.GetBytes("与移动端服务共享的JWT签名密钥");
        var validateParams = new TokenValidationParameters
        {
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(securityKey),
            ValidateIssuer = true,
            ValidIssuer = "移动端服务的合法签发标识",
            ValidateAudience = true,
            ValidAudience = "我方支付应用的合法受众标识",
            ValidateLifetime = true,
            ClockSkew = TimeSpan.FromMinutes(1)
        };

        try
        {
            var tokenHandler = new JwtSecurityTokenHandler();
            // 执行校验与解析
            var principal = tokenHandler.ValidateToken(jwtToken, validateParams, out _);
            // 将解析后的身份绑定到当前请求上下文
            filterContext.HttpContext.User = principal;
            Thread.CurrentPrincipal = principal;
        }
        catch
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }
    }
}
  • 过滤器使用方式:在需要鉴权的支付页Action或Controller上直接标注[JwtAuthorize]即可生效,和原有MVC的鉴权机制完全兼容

生产环境落地注意事项

  • 全链路强制启用HTTPS,避免JWT在传输过程中被截获篡改
  • JWT校验通过后,可在服务端生成短期一次性会话标识,后续支付流程基于会话标识鉴权,减少JWT的重复传输次数
  • 针对WebView加载场景,可额外校验请求的User-Agent是否与约定的移动端客户端标识匹配,避免外部恶意请求携带合法JWT绕过移动端直接访问支付页面
  • 对JWT校验失败的请求记录来源IP、请求参数特征,及时排查恶意爬取、尝试攻击的行为

内容的提问来源于stack exchange,提问作者Carlos Guevara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 09:57:03