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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:15:10