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

Microsoft Entra ID:React与.NET Core实现授权码流程时如何获取Authorization Code?

问题分析与解决方案

核心原因:MSAL.js v2.x 针对SPA的授权流程设计

你遇到的问题本质是对MSAL.js在SPA场景下的授权流程理解偏差:

  • MSAL.js v2.x 针对单页应用(SPA)默认使用 Authorization Code Flow with PKCE,而非传统的Authorization Code Flow(后者专为有后端存储能力的Web App设计)。
  • 在PKCE流程中,授权码会被MSAL在浏览器后台自动交换为AccessToken,不会暴露给前端代码,所以你在handleRedirectPromise()的响应中拿不到authorizationCode是正常的安全设计。
  • 你看到的返回AccessToken的情况,正是PKCE流程的预期结果,而非Implicit Flow(Implicit Flow已被OAuth 2.1废弃,MSAL.js v2默认不再使用)。

正确实现"前端触发授权,后端获取/使用AccessToken"的两种方案

方案1:后端作为OAuth客户端主导授权流程(推荐后端需要自主调用API的场景)

这种模式下,后端(ASP.NET Core)作为Azure AD的客户端,直接处理授权码交换,前端仅负责跳转和会话同步:

  1. 在Azure AD应用注册中,配置客户端密钥(因为后端可以安全存储密钥),取消Implicit Flow选项。
  2. 后端使用Microsoft.Identity.Web库配置授权:
    // Program.cs
    builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
        .EnableTokenAcquisitionToCallDownstreamApi(new[] { "api://your-api-scope/access" })
        .AddInMemoryTokenCaches();
    
    builder.Services.AddControllersWithViews();
    
  3. 前端无需集成MSAL.js,直接跳转到后端的/signin-oidc端点触发授权,后端完成授权码交换后将AccessToken存储在服务器端缓存中,前端通过Cookie会话与后端交互。

方案2:前端用PKCE获取AccessToken,传递给后端验证使用(适合前端主导API调用的场景)

如果需要前端触发授权,再将AccessToken传给后端验证或转发:

  1. 前端保持MSAL.js v2.x的PKCE配置(默认即为PKCE,无需额外修改):
    const msalConfig = {
        auth: {
            clientId: "你的客户端ID",
            authority: "https://login.microsoftonline.com/你的租户ID",
            redirectUri: "/auth/callback"
        },
        cache: {
            cacheLocation: "sessionStorage"
        }
    };
    
    const msalInstance = new msal.PublicClientApplication(msalConfig);
    
    // 发起登录授权
    msalInstance.loginRedirect({ scopes: ["api://your-api-scope/user.read"] });
    
    // 处理回调并获取AccessToken
    msalInstance.handleRedirectPromise().then(res => {
        if (res?.accessToken) {
            // 将AccessToken传给后端
            fetch("/api/protected/resource", {
                headers: { Authorization: `Bearer ${res.accessToken}` }
            });
        }
    }).catch(err => console.error(err));
    
  2. 后端使用Microsoft.Identity.Web验证AccessToken:
    // Program.cs
    builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));
    
    builder.Services.AddControllers();
    
  3. 在需要验证的控制器/方法上添加[Authorize]属性,后端会自动验证AccessToken的有效性。

关键误区纠正

  • Quickstart中的SPA示例使用的是Authorization Code Flow with PKCE,并非Implicit Flow——MSAL.js v2已彻底移除了对Implicit Flow的默认支持,你看到的返回AccessToken是PKCE流程的正常结果。
  • 不要尝试让SPA直接获取授权码:SPA无法安全存储客户端密钥,直接暴露授权码会带来安全风险,PKCE流程正是为解决这个问题设计的。

内容的提问来源于stack exchange,提问作者BobDidley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:43:31