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

如何在Azure HTTP函数中获取OAuth2客户端应用名称

获取Azure AD客户端应用名称的C#实现方案

当然可行!你遇到的困惑其实是因为AAD颁发的访问令牌默认不会直接包含客户端应用的显示名称,但我们可以通过两种方式来获取:先从令牌的Claims里拿到客户端ID,再通过静态映射或Graph API查询名称。

第一步:从令牌中提取客户端ID

首先,客户端调用API时携带的访问令牌里,已经包含了客户端应用的唯一标识——客户端ID,对应的Claim类型通常是azp(全称Authorized Party,代表请求令牌的客户端),部分场景下也可能是appid。

你可以在C#函数里这样获取:

using System.Security.Claims;
using Microsoft.AspNetCore.Http;

// 在你的函数方法中
var httpContext = req.HttpContext;
var clientId = httpContext.User.Claims.FirstOrDefault(c => c.Type == "azp")?.Value;

// 如果没找到azp,尝试检查appid
if (string.IsNullOrEmpty(clientId))
{
    clientId = httpContext.User.Claims.FirstOrDefault(c => c.Type == "appid")?.Value;
}

if (string.IsNullOrEmpty(clientId))
{
    // 处理无法获取客户端ID的情况
    return new BadRequestObjectResult("无法从令牌中获取客户端应用ID");
}

第二步:获取客户端应用名称的两种方式

方式1:静态映射(适合客户端数量少的场景)

如果你的客户端应用数量不多且名称固定,可以在函数应用的配置中(比如Azure App Service的「配置」→「应用程序设置」)添加键值对,把客户端ID和名称对应起来,比如ClientApp_<你的客户端ID>=clienttest。

然后在代码中读取配置并映射:

using Microsoft.Extensions.Configuration;

// 注入IConfiguration
private readonly IConfiguration _configuration;

public YourFunction(IConfiguration configuration)
{
    _configuration = configuration;
}

// 在函数方法中
var clientAppName = _configuration[$"ClientApp_{clientId}"];
if (string.IsNullOrEmpty(clientAppName))
{
    clientAppName = "未知客户端";
}
// 现在你可以使用clientAppName了

方式2:调用Microsoft Graph API(动态获取,适合多客户端场景)

如果需要动态获取最新的客户端应用名称,推荐调用Microsoft Graph API根据客户端ID查询应用信息。这需要给你的函数应用注册的AAD应用添加相应权限:

  1. 登录Azure Portal,找到函数应用对应的AAD注册(在「应用注册」中搜索你的函数应用名称)
  2. 进入「API权限」→「添加权限」→选择「Microsoft Graph」→「应用权限」
  3. 搜索并添加Application.Read.All权限,然后点击「授予管理员同意」

之后在函数中使用Azure.Identity和Microsoft.Graph库来调用API:

首先安装NuGet包:

Install-Package Azure.Identity
Install-Package Microsoft.Graph

然后编写代码:

using Microsoft.Graph;
using Azure.Identity;

// 在函数方法中
var graphClient = new GraphServiceClient(new DefaultAzureCredential());
string clientAppName = string.Empty;

try
{
    var application = await graphClient.Applications[clientId].GetAsync();
    clientAppName = application.DisplayName ?? "未知客户端";
}
catch (ServiceException ex)
{
    // 处理异常,比如权限不足、应用不存在等
    return new StatusCodeResult(StatusCodes.Status500InternalServerError);
}

// 使用clientAppName进行后续操作
return new OkObjectResult($"当前调用的客户端应用名称:{clientAppName}");

验证令牌Claims的小技巧

你可以用jwt.ms解码客户端获取的访问令牌,查看里面的所有Claims,确认azp或appid的值是否为你的客户端应用ID,这能帮你快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:17:52