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

无需用户弹窗 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实现步骤

  1. 新建HTTP请求,填写WebAPI的实际请求地址与请求方法
  2. 切换到Authorization标签页,授权类型选择OAuth 2.0
  3. 按如下参数配置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
  4. 点击Get New Access Token按钮,获取成功后点击Use Token,Postman会自动将Bearer令牌填充到请求头的Authorization字段
  5. 直接发送请求即可完成接口调用,若要全自动化可以将所有参数配置为Postman环境变量,运行集合测试时会自动获取令牌无需手动操作

C#实现步骤

  1. 安装NuGet依赖包:Microsoft.Identity.Client
  2. 参考以下代码实现令牌获取与接口调用:
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封装工具,二者核心逻辑完全一致。

  1. 安装依赖:
    # 通用JS库,Angular/React都适用
    npm install @azure/msal-browser
    # Angular额外安装
    npm install @azure/msal-angular
    
  2. 核心实现代码:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:06:01