ASP.NET Web API Token认证报错:Authorization has been denied for this request
排查ASP.NET Web API认证授权失败问题的步骤
1. 确认令牌获取流程是否正确
- ASP.NET Web API的OAuth2认证流程需要先获取Bearer令牌,而非直接在请求头传递用户名密码。先请求
/token端点,传入grant_type=password、username、password参数,获取返回的access_token。 - 检查
ApiAuthorizationServerProvider的GrantResourceOwnerCredentials方法:- 确认正确查询用户信息,密码比对逻辑无误(注意用哈希值比对,别直接明文校验)
- 确保生成的
ClaimsIdentity指定了AuthenticationTypes.Bearer - 检查是否调用
context.Validated(ticket)完成验证流程,未调用会直接拒绝认证
2. 检查Postman请求格式
- 调用带
[Authorize]的接口时,请求头必须添加Authorization: Bearer {你的access_token},不能直接传用户名密码。 - 确认请求的
Content-Type设置正确(如application/json),格式错误会导致令牌解析失败。
3. 排查自定义ApiAuthorizeAttribute逻辑
- 若该类继承自
AuthorizeAttribute,检查OnAuthorization方法是否存在逻辑错误:- 确保没有错误跳过认证检查,或在验证逻辑中错误返回拒绝结果
- 确认调用了基类方法
base.OnAuthorization(actionContext);,避免覆盖默认认证逻辑
4. 验证AuthenticationStartup的中间件顺序
- ASP.NET中间件顺序直接影响功能生效,确保:
- 先注册
app.UseOAuthAuthorizationServer(OAuthOptions),再注册app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()) app.UseWebApi(config)必须在认证中间件之后注册,否则路由会优先执行,认证逻辑不生效- 检查OAuth配置的
TokenEndpointPath是否与你请求的令牌端点一致(默认是/token)
- 先注册
5. 检查令牌验证逻辑
- 在
ApiAuthorizationServerProvider的ValidateClientAuthentication方法中,若不需要客户端验证,直接返回context.Validated()即可,别错误拒绝请求。 - 确认令牌签名密钥一致、有效期正常,密钥不匹配会导致令牌无法解析。
6. 启用调试日志定位问题
- 在Web.config中添加日志配置,获取认证过程的详细错误:
<system.diagnostics> <sources> <source name="Microsoft.Owin" switchValue="Verbose"> <listeners> <add name="traceListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="owin.log" /> </listeners> </source> </sources> </system.diagnostics> - 运行程序后查看生成的
owin.log,里面会记录令牌解析失败、用户验证失败等具体原因。
7. 简化逻辑测试
- 暂时替换自定义
ApiAuthorizeAttribute为系统自带的[Authorize],若能正常访问,说明问题出在自定义授权属性的逻辑中。 - 简化
ApiAuthorizationServerProvider逻辑,比如固定验证通过一个测试用户,排除业务逻辑导致的验证失败。
内容的提问来源于stack exchange,提问作者Abu Bakar Afzal
相关产品推荐
相关产品推荐

