使用Postman调用.NET API时返回登录页而非预期内容的问题求助
问题描述
使用Postman调用.NET API时,未收到预期返回内容,而是得到HTML登录页面。尝试传递Token无效,仅浏览器可正常访问,Postman无法复现OpenID Connect认证流程。即使移除API控制器上的[Authorize]特性,Postman请求仍返回登录页面。
现有配置代码
Startup.cs 认证与MVC配置
services.AddMicrosoftIdentityWebAppAuthentication(Configuration) .EnableTokenAcquisitionToCallDownstreamApi() .AddMicrosoftGraph(options => { Configuration.Bind("AzureAd", options); options.Scopes = AppSettings.GetScopes(); }) .AddInMemoryTokenCaches(); services.AddControllersWithViews(options => { var policy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); options.Filters.Add(new AuthorizeFilter(policy)); }); app.UseAuthentication(); app.UseAuthorization();
API控制器代码
[Area("Technology")] [ApiController] [Route("api/tasks")] [Authorize] public class TaskController : Controller { [HttpGet("{message}")] public ActionResult<string> GetMessage(string message) { _telemetry.TrackEvent($"Get Request ran with a message of {message}"); return message; } }
问题根源与解决方法
1. 错误使用WebApp认证方案而非WebApi方案
AddMicrosoftIdentityWebAppAuthentication是为MVC/Razor Pages设计的Cookie认证方案,会将未认证请求重定向到登录页(返回HTML)。而API服务应使用针对Bearer Token的AddMicrosoftIdentityWebApiAuthentication,未认证时返回401状态码,符合API的交互逻辑。
修改Startup中的认证配置:
// 替换原AddMicrosoftIdentityWebAppAuthentication为WebApi版本 services.AddMicrosoftIdentityWebApiAuthentication(Configuration, "AzureAd") .EnableTokenAcquisitionToCallDownstreamApi() .AddMicrosoftGraph(options => { Configuration.Bind("AzureAd", options); options.Scopes = AppSettings.GetScopes(); }) .AddInMemoryTokenCaches();
2. 全局授权过滤器覆盖控制器配置
你在AddControllersWithViews中添加了全局AuthorizeFilter,要求所有请求必须认证。即使移除控制器上的[Authorize],全局过滤器仍会生效,且因为原WebApp认证的重定向逻辑,返回登录页面。
针对API分离配置
如果你的项目同时包含MVC视图和API,需要分开配置:
// 为MVC视图添加全局授权(保留原逻辑) services.AddControllersWithViews(options => { var policy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); options.Filters.Add(new AuthorizeFilter(policy)); }); // 单独配置API控制器,不添加全局授权(或按需配置) services.AddControllers() .AddMicrosoftIdentityWebApi(Configuration);
如果是纯API项目,直接替换为:
services.AddControllers(options => { // 若需要全局API授权,可保留,否则移除该过滤器配置 // var policy = new AuthorizationPolicyBuilder() // .RequireAuthenticatedUser() // .Build(); // options.Filters.Add(new AuthorizeFilter(policy)); }) .AddMicrosoftIdentityWebApi(Configuration);
3. Postman中正确传递Token的步骤
修改配置后,在Postman中按以下步骤请求:
- 获取Azure AD的Bearer Token(使用客户端凭证流或授权码流,根据你的API权限配置)
- 在请求头中添加
Authorization: Bearer <你的Token> - 确保Token包含API所需的Scope
额外检查点
- 确认中间件顺序正确,
app.UseRouting()必须在认证、授权中间件之前:
app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });
内容的提问来源于stack exchange,提问作者Donald518
相关产品推荐
相关产品推荐

