ASP.NET OAuth 2.0请求持续返回Authorization has been denied问题排查
问题分析与解决方案
核心问题诊断
你的代码存在几个关键问题导致Bearer Token验证失败,同时先明确Owin Startup的执行逻辑:
- Startup.cs会自动执行:你已经添加了
[assembly: OwinStartup(typeof(IMOTBaseWebAPI.Startup))]特性,只要项目安装了Microsoft.Owin.Host.SystemWeb包,Owin就会自动识别并执行这个类,无需手动调用。 - Token验证核心配置缺失:当前的
OAuthBearerAuthenticationOptions只是空实例,没有配置验证Token合法性的关键参数(签名密钥、颁发者、受众等),而你的Token是独立项目生成的,API必须匹配生成端的配置才能验证通过。 - WebApi配置重复注册:
Startup.cs里新建HttpConfiguration并调用WebApiConfig.Register,同时Global.asax的Application_Start也做了相同操作,会引发配置冲突。
修复步骤
1. 确认安装必要NuGet包
确保API项目已安装以下包:
Microsoft.OwinMicrosoft.Owin.Security.OAuthMicrosoft.Owin.Host.SystemWebMicrosoft.AspNet.WebApi.OwinMicrosoft.Owin.Cors
2. 完善OAuth验证配置
修改Startup.cs的ConfigurationOAuth方法,添加与Token生成端一致的验证参数:
private void ConfigurationOAuth(IAppBuilder app) { // 以下参数必须和生成Token的项目完全一致 var issuer = "你的Token颁发者地址/标识"; var audience = "你的Token受众标识"; var signingKey = "你的签名密钥(对称加密需完全匹配,非对称加密用公钥)"; OAuthBearerOptions = new OAuthBearerAuthenticationOptions { TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters { ValidateIssuer = true, ValidIssuer = issuer, ValidateAudience = true, ValidAudience = audience, ValidateIssuerSigningKey = true, IssuerSigningKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(signingKey)), ValidateLifetime = true // 验证Token是否过期 } }; app.UseOAuthBearerAuthentication(OAuthBearerOptions); }
3. 修复WebApi配置重复问题
删除Startup.cs中重复的WebApi注册代码,修改后的Configuration方法:
public void Configuration(IAppBuilder app) { ConfigurationOAuth(app); app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); // 使用GlobalConfiguration的全局实例,避免重复注册 app.UseWebApi(GlobalConfiguration.Configuration); }
4. 确保API添加授权特性
检查你的API控制器或Action是否添加了[Authorize]特性,没有的话必须加上,否则不会触发Token验证:
[Authorize] public class YourApiController : ApiController { // 你的API方法 }
额外检查项
- 确认Postman请求头格式正确:
Authorization: Bearer {你的Token},注意Bearer后有空格,Token无多余空格或换行。 - 用JWT解码工具查看Token的
exp字段,确认Token未过期。 - 如果生成Token用的是RSA非对称加密,需将生成端的公钥配置到API的
IssuerSigningKey中。
内容的提问来源于stack exchange,提问作者Danish Ghazi
相关产品推荐
相关产品推荐

