.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:匹配你配置的ValidIssueraud:匹配你配置的ValidAudienceclient_id:包含合法的客户端标识
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

