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

React+ASP.NET Core 6前后端集成Azure AD B2C最佳方案咨询

React + ASP.NET Core 6 前后端分离架构集成Azure AD B2C 身份认证方案

你列出的两种候选方案均存在安全设计缺陷,不符合身份认证领域的零信任安全原则,下面先明确问题,再给出符合业界生产级实践的落地方案。

两种候选方案的核心问题

  • 方案1硬伤:
    1. 前端无权限生成认证Cookie类认证凭证。前端运行在用户可控的浏览器环境,没有安全边界,一旦凭证生成规则泄露,攻击者可任意伪造用户身份绕过所有认证校验。
    2. 注册完成后由前端触发写库逻辑没有可信校验链路,攻击者可直接构造“注册成功”的虚假请求,绕过B2C认证流程直接在你的业务库插入非法用户数据。
  • 方案2硬伤:
    1. 由后端代理转发用户注册/登录请求到B2C属于冗余设计,平白增加了用户密码、MFA校验信息等敏感数据的泄露面——这类敏感数据本就应该由B2C直接承接处理,不需要经过你的业务后端。
    2. 跨域前后端分离场景下用Cookie做认证凭证,需要严格配置CORS策略、SameSite属性、CSRF防护规则,运维和开发成本远高于常规的令牌认证模式,很容易出现安全漏洞。

生产级推荐实现工作流

这套方案是该技术栈下的标准生产实现模式,完全满足你将用户同步到自有SQL Server业务库的需求,同时把安全风险降到最低:
核心设计原则:所有认证交互完全由Azure AD B2C承接,业务后端只做令牌合法性校验和业务数据关联,不接触用户认证敏感信息,用户同步动作走服务端可信链路,不经过前端触发。
具体流程:

  1. 前端React应用集成官方@azure/msal-browser + @azure/msal-react库,所有注册、登录、密码重置、多因素校验的交互,全部直接跳转至Azure AD B2C托管的统一认证页面完成,前端不收集、不存储、不转发用户的认证敏感信息(如密码、验证码)。
  2. 用户完成注册/登录流程后,B2C会直接向前端返回两类签名令牌:id_token(存储用户唯一标识、基础属性的身份令牌)、access_token(用于访问后端API的访问令牌)。前端不需要自己生成任何认证凭证,仅需将两个令牌存储在浏览器运行内存中(禁止存入localStorage,避免XSS攻击窃取令牌)。
  3. 前端调用后端ASP.NET Core 6接口时,主动将access_token放在HTTP请求头的Authorization字段中,格式为Bearer <令牌内容>。
  4. 后端引入官方Microsoft.Identity.Web类库,在Program.cs中配置JWT Bearer认证中间件,中间件会自动完成所有请求的令牌校验:包括验证令牌签名是否为B2C签发、是否在有效期内、受众是否匹配当前API,校验不通过直接返回401状态码,不需要手写校验逻辑。
  5. 用户信息同步到自有SQL Server库,二选一即可:
    • 即时同步:配置Azure AD B2C的API连接器,在用户完成注册、B2C正式创建用户对象的节点,由B2C通过服务端到服务端的可信链路调用你预留的后端同步接口,携带用户在B2C侧的唯一标识objectId、注册时填写的自定义属性。后端收到请求后先校验请求携带的B2C专属API密钥确认请求来源合法,再将用户信息写入SQL Server业务用户表,完成和其他业务表的关联。整个链路完全不经过公网前端,不存在被伪造的风险。
    • 懒加载同步:不需要额外配置B2C连接器,在后端认证中间件校验令牌合法后,从令牌中解析出用户的objectId和基础属性,先查询本地SQL Server中是否存在对应用户,不存在则自动插入用户记录,再继续处理业务请求。该方式实现成本最低,仅有的差异是用户首次发起业务请求时才会完成库表同步,而非注册完成立刻同步,绝大多数业务场景下完全适用。

认证Cookie与用户会话的核心常识

  • 跨域前后端分离架构优先选择Bearer Token认证模式,不推荐Cookie认证:Cookie的域绑定、SameSite策略、CSRF防护配置复杂度高,跨域部署时很容易出现凭证丢失、跨站请求伪造问题;Bearer Token由前端主动携带在请求头中,天然规避CSRF风险,维护成本极低。
  • 所有认证凭证的签发权只能交给可信的身份提供方(即Azure AD B2C)或者你的自有后端,前端只有存储、传递凭证的权限,绝对不能参与凭证生成、签发逻辑。
  • 用户会话生命周期直接和B2C签发的令牌有效期对齐即可,不需要额外维护独立的会话存储。需要强制用户登出时,调用B2C的登出接口同时清空前端内存中存储的令牌即可。

可直接复用的基础配置代码

后端ASP.NET Core 6 Program.cs 认证配置片段:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;

var builder = WebApplication.CreateBuilder(args);

// 配置B2C认证
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAdB2C"));
builder.Services.AddControllers();

var app = builder.Build();

// 注意中间件顺序,认证必须在授权、接口映射之前
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();

app.Run();

前端React MSAL初始化片段:

import { PublicClientApplication } from "@azure/msal-browser";
import { MsalProvider } from "@azure/msal-react";

const msalConfig = {
  auth: {
    clientId: "你的B2C前端应用客户端ID",
    authority: "https://<你的B2C租户名>.b2clogin.com/<你的B2C租户名>.onmicrosoft.com/<注册登录用户流ID>",
    redirectUri: window.location.origin
  },
  cache: {
    cacheLocation: "memoryStorage", // 令牌存在内存中,不要用localStorage
    storeAuthStateInCookie: false
  }
};

const msalInstance = new PublicClientApplication(msalConfig);

// 根组件包裹MsalProvider即可
function App({ children }) {
  return <MsalProvider instance={msalInstance}>{children}</MsalProvider>
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:19:20