无需用户弹窗 C#/Postman自动化生成SPFX SSO Azure AD访问令牌测试WebAPI
无弹窗自动化获取Azure AD令牌测试WebAPI实现方案
前置准备
执行以下方案前需先获取以下参数:
- Azure AD租户ID:可从Azure门户Azure AD概览页获取
- 客户端ID:你SPFX应用对应的Azure AD应用注册的客户端ID
- WebAPI作用域:格式一般为
api://<WebAPI应用注册客户端ID>/<权限名>,比如api://xxxx-xxxx-xxxx/access_as_user - 测试账号:无MFA的Azure AD普通用户账号、密码
Postman实现步骤
- 新建HTTP请求,填写WebAPI的实际请求地址与请求方法
- 切换到Authorization标签页,授权类型选择
OAuth 2.0 - 按如下参数配置OAuth 2.0属性:
- Token Name:自定义名称,比如
Azure AD Test Token - Grant Type:选择
Password Credentials(ROPC密码流) - Access Token URL:填写
https://login.microsoftonline.com/<替换为你的租户ID>/oauth2/v2.0/token - Client ID:填写前置准备中获取的客户端ID
- Username:填写测试用户账号
- Password:填写测试用户密码
- Scope:填写WebAPI作用域,多个作用域用空格分隔
- Client Authentication:选择
Send as Basic Auth header
- Token Name:自定义名称,比如
- 点击Get New Access Token按钮,获取成功后点击Use Token,Postman会自动将Bearer令牌填充到请求头的
Authorization字段 - 直接发送请求即可完成接口调用,若要全自动化可以将所有参数配置为Postman环境变量,运行集合测试时会自动获取令牌无需手动操作
C#实现步骤
- 安装NuGet依赖包:
Microsoft.Identity.Client - 参考以下代码实现令牌获取与接口调用:
using Microsoft.Identity.Client; using System.Net.Http.Headers; // 配置参数 const string tenantId = "替换为你的租户ID"; const string clientId = "替换为你的客户端ID"; string[] scopes = { "替换为你的WebAPI作用域" }; const string username = "替换为测试用户账号"; const string password = "替换为测试用户密码"; const string webApiUrl = "替换为你的WebAPI请求地址"; // 构造公共客户端实例 var publicClientApp = PublicClientApplicationBuilder .Create(clientId) .WithAuthority(AzureCloudInstance.AzurePublic, tenantId) .Build(); // 用户名密码流获取访问令牌 var authResult = await publicClientApp.AcquireTokenByUsernamePassword(scopes, username, password) .ExecuteAsync(); var accessToken = authResult.AccessToken; // 调用WebAPI using var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); var response = await httpClient.GetAsync(webApiUrl); response.EnsureSuccessStatusCode(); var responseContent = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseContent);
Angular/React实现步骤
前端场景下统一使用微软官方msal-browser库实现,Angular可搭配@azure/msal-angular封装工具,二者核心逻辑完全一致。
- 安装依赖:
# 通用JS库,Angular/React都适用 npm install @azure/msal-browser # Angular额外安装 npm install @azure/msal-angular - 核心实现代码:
import { PublicClientApplication, UsernamePasswordRequest } from "@azure/msal-browser"; // MSAL基础配置 const msalConfig = { auth: { clientId: "替换为你的客户端ID", authority: "https://login.microsoftonline.com/替换为你的租户ID" } }; const publicClientApp = new PublicClientApplication(msalConfig); // 用户名密码流请求参数 const tokenRequest: UsernamePasswordRequest = { scopes: ["替换为你的WebAPI作用域"], username: "替换为测试用户账号", password: "替换为测试用户密码" }; // 获取令牌并调用接口 publicClientApp.acquireTokenByUsernamePassword(tokenRequest) .then(res => { const accessToken = res.accessToken; // 发起接口请求 fetch("替换为你的WebAPI地址", { headers: { "Authorization": `Bearer ${accessToken}` } }).then(resp => resp.json()).then(data => console.log("接口返回结果:", data)); }) .catch(err => console.error("获取令牌失败:", err));
注意事项
- 以上实现均使用ROPC(资源所有者密码凭证)流,仅适用于内部自动化测试场景,禁止在生产环境使用,生产环境前端请使用授权码流+PKCE,服务端请使用客户端凭证流。
- 测试用户必须关闭MFA(多因素认证),否则ROPC流会认证失败。
- 你使用的客户端应用注册需要提前被授予WebAPI的对应访问权限,否则获取的令牌无法正常调用接口。
内容的提问来源于stack exchange,提问作者SureshRajamani
相关产品推荐
相关产品推荐

