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

.NET Framework API切换OpenID与JWT授权:寻找验证中间件

.NET Framework API 切换到 JWT + OpenID 授权的正确配置方案

你之前用错了认证中间件——OAuthBearerAuthenticationOptions 是通用OAuth Bearer令牌的配置类,不包含TokenValidationParameters,要验证JWT得用**JwtBearerAuthenticationOptions**,它来自Microsoft.Owin.Security.Jwt包。以下是完整的配置步骤:

1. 安装依赖NuGet包

先安装JWT验证所需的核心包:

Install-Package Microsoft.Owin.Security.Jwt
Install-Package System.IdentityModel.Tokens.Jwt

2. 在Startup类中配置JWT认证中间件

替换原有的SimpleAuthorizationServerProvider配置,改用JWT验证逻辑:

using Microsoft.Owin;
using Owin;
using Microsoft.Owin.Security.Jwt;
using System.IdentityModel.Tokens.Jwt;
using System.Threading.Tasks;

[assembly: OwinStartup(typeof(YourApiProject.Startup))]
namespace YourApiProject
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // 从配置文件读取(建议不要硬编码)
            var authServerIssuer = "https://your-auth-server-domain";
            var apiAudience = "your-api-audience-identifier";
            // 与授权服务器一致的签名密钥
            var signingKey = Convert.FromBase64String("your-auth-server-signing-key");

            // 配置JWT验证核心参数
            var tokenValidationParams = new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidIssuer = authServerIssuer,

                ValidateAudience = true,
                ValidAudience = apiAudience,

                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(signingKey),

                ValidateLifetime = true,
                ClockSkew = TimeSpan.FromSeconds(30) // 允许的时间偏差
            };

            // 注册JWT认证中间件
            app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
            {
                TokenValidationParameters = tokenValidationParams,
                // 自定义校验client_id逻辑
                Provider = new OAuthBearerAuthenticationProvider
                {
                    OnTokenValidated = context =>
                    {
                        // 从JWT Claims中提取client_id
                        var clientIdClaim = context.AuthenticationTicket.Identity.FindFirst("client_id");
                        if (clientIdClaim == null || !IsValidClient(clientIdClaim.Value))
                        {
                            // 验证不通过则拒绝请求
                            context.Rejected();
                        }
                        return Task.CompletedTask;
                    }
                }
            });

            // 配置Web API路由
            ConfigureWebApi(app);
        }

        // 自定义client_id校验逻辑(可替换为从数据库/配置读取合法列表)
        private bool IsValidClient(string clientId)
        {
            return clientId == "your-valid-client-id";
        }

        private void ConfigureWebApi(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            app.UseWebApi(config);
        }
    }
}

关键说明

  • JwtBearerAuthenticationOptions是专门为JWT设计的中间件配置类,自带TokenValidationParameters属性,用于配置issuer、audience等核心验证规则
  • client_id通常会被授权服务器放入JWT的Payload中作为Claim,需在OnTokenValidated事件中提取并校验
  • 确保授权服务器生成的JWT包含以下Claim:
    • iss:匹配你配置的ValidIssuer
    • aud:匹配你配置的ValidAudience
    • client_id:包含合法的客户端标识

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:17:30