
本文详细介绍如何在 php(尤其是 slim 框架)项目中集成 azure ad b2c 实现安全、标准化的用户认证,涵盖注册/登录流程、openid connect 配置、token 验证及 azure 部署关键步骤。
Azure Active Directory B2C(Azure AD B2C)是面向消费者身份管理的云服务,支持自定义策略、多因素认证、社交账号登录(如 Google、Facebook),并能与 Microsoft Dynamics 365 Customer Engagement(CE)无缝对接——这使其成为企业级客户门户的理想认证后端。尽管官方示例主要基于 Laravel,但其底层依赖 OpenID Connect 协议,完全兼容任何标准 PHP 应用(包括 Slim、Lumen 或原生 PHP),无需框架强绑定。
✅ 核心集成原理
Azure AD B2C 通过 OpenID Connect(OIDC) 提供标准化的身份验证流。PHP 应用只需:
- 重定向用户至 B2C 授权端点(https://
.b2clogin.com/ .onmicrosoft.com/ /oauth2/v2.0/authorize); - 接收授权码(code)后,向令牌端点交换 id_token 和 access_token;
- 使用公钥(JWKS URI)验证 id_token 签名,并解析声明(如 sub, email, name)完成登录。
?️ 实施步骤(Slim 框架适配版)
-
Azure 门户配置
- 在 Azure Portal → Azure AD B2C 创建租户(若未有);
- 注册应用:选择“应用”→“新注册”,设置重定向 URI 为 https://yourdomain.com/callback(生产环境需 HTTPS);
- 记录 Application (client) ID 和 Client secret(在“证书和密码”中生成);
- 创建用户流(User Flow),例如 B2C_1_signupsignin,启用邮箱/用户名登录。
-
PHP 端集成(Slim 4 示例)
安装必要依赖:composer require league/oauth2-client guzzlehttp/guzzle firebase/php-jwt
在 Slim 路由中实现登录与回调逻辑:
立即学习“PHP免费学习笔记(深入)”;
破浪分红权返利系统基础版下载破浪分红权返利系统是在破浪直销系统的基础上独立自主开发的一套稳定完善的购物商场网站管理系统,系统基于PHP+MYSQL开发,集购物商城、积分商城、商家联盟、会员营销机制等一体,模板与程序分离,集成网上支付,嵌入型短信应用API集成,使用简单、功能强大,多种返现模式可自由选择,为广大创业者者提供一个快速、高效、稳定、安全的电子商务系统。系统集O2O\C2C\B2C\B2B2C以及直销、分红、代理、分
// routes.php use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; $app->get('/login', function (Request $request, Response $response) { $authUrl = 'https://.b2clogin.com/ .onmicrosoft.com/B2C_1_signupsignin/oauth2/v2.0/authorize?' . http_build_query([ 'client_id' => 'YOUR_CLIENT_ID', 'response_type' => 'code', 'redirect_uri' => 'https://yourdomain.com/callback', 'response_mode' => 'query', 'scope' => 'openid profile email', 'nonce' => bin2hex(random_bytes(16)), 'state' => bin2hex(random_bytes(16)), ]); return $response->withStatus(302)->withHeader('Location', $authUrl); }); $app->get('/callback', function (Request $request, Response $response) { $code = $request->getQueryParam('code'); $state = $request->getQueryParam('state'); // 1. 用 code 换取 token $tokenResponse = \GuzzleHttp\Client()->post( 'https:// .b2clogin.com/ .onmicrosoft.com/B2C_1_signupsignin/oauth2/v2.0/token', [ 'form_params' => [ 'grant_type' => 'authorization_code', 'client_id' => 'YOUR_CLIENT_ID', 'client_secret' => 'YOUR_CLIENT_SECRET', 'code' => $code, 'redirect_uri' => 'https://yourdomain.com/callback', 'scope' => 'openid profile email' ] ] ); $tokens = json_decode($tokenResponse->getBody(), true); // 2. 验证 id_token(关键!) $jwksUri = 'https:// .b2clogin.com/ .onmicrosoft.com/discovery/v2.0/keys?p=B2C_1_signupsignin'; $jwks = json_decode(file_get_contents($jwksUri), true); $key = \Firebase\JWT\JWK::parseKeySet($jwks); $payload = \Firebase\JWT\JWT::decode($tokens['id_token'], $key, ['RS256']); // 3. 登录成功,写入会话 $_SESSION['user'] = [ 'sub' => $payload->sub, 'email' => $payload->email ?? null, 'name' => $payload->name ?? null ]; return $response->withStatus(302)->withHeader('Location', '/dashboard'); }); -
安全注意事项
- ✅ 始终验证 id_token 的签名、iss(应为 https://
.b2clogin.com/ /v2.0/)、aud(必须匹配 client_id)、exp 和 nbf; - ✅ 使用 state 参数防止 CSRF(务必在 session 中存储并比对);
- ✅ 生产环境禁用 http://localhost 重定向 URI;
- ✅ 敏感凭据(client_secret)不得硬编码,应通过环境变量注入(.env + vlucas/phpdotenv);
- ⚠️ Slim 默认无会话中间件,需手动启用:$app->add(new \Slim\Middleware\SessionMiddleware());。
- ✅ 始终验证 id_token 的签名、iss(应为 https://
-
部署到 Azure(推荐方式)
- 在 Azure App Service 中创建 PHP 环境(建议 PHP 8.1+);
- 启用本地 Git 部署:App Service → “Deployment Center” → “Local Git” → 设置凭据;
- 初始化本地仓库并推送:
git init git remote add azure https://
@ .scm.azurewebsites.net:443/ .git git add . git commit -m "Initial B2C integration" git push azure master
? 提示:若坚持使用 Slim(而非 Laravel),可参考社区维护的轻量 OIDC 客户端库(如 web-auth/webauthn-lib 或 jumbojett/openid-connect-php),避免重复造轮子。官方示例虽基于 Laravel,但其 config/b2c.php 和 AuthController.php 的逻辑可直接迁移至 Slim 的路由与中间件中。
通过以上配置,您的 PHP 客户门户即可获得企业级身份认证能力,并为后续与 Dynamics CE 的 API 集成(通过 access_token 调用 Web API)奠定坚实基础。










