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

ASP.NET OAuth 2.0请求持续返回Authorization has been denied问题排查

问题分析与解决方案

核心问题诊断

你的代码存在几个关键问题导致Bearer Token验证失败,同时先明确Owin Startup的执行逻辑:

  1. Startup.cs会自动执行:你已经添加了[assembly: OwinStartup(typeof(IMOTBaseWebAPI.Startup))]特性,只要项目安装了Microsoft.Owin.Host.SystemWeb包,Owin就会自动识别并执行这个类,无需手动调用。
  2. Token验证核心配置缺失:当前的OAuthBearerAuthenticationOptions只是空实例,没有配置验证Token合法性的关键参数(签名密钥、颁发者、受众等),而你的Token是独立项目生成的,API必须匹配生成端的配置才能验证通过。
  3. WebApi配置重复注册:Startup.cs里新建HttpConfiguration并调用WebApiConfig.Register,同时Global.asax的Application_Start也做了相同操作,会引发配置冲突。

修复步骤

1. 确认安装必要NuGet包

确保API项目已安装以下包:

  • Microsoft.Owin
  • Microsoft.Owin.Security.OAuth
  • Microsoft.Owin.Host.SystemWeb
  • Microsoft.AspNet.WebApi.Owin
  • Microsoft.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:47:48