如何在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应用添加相应权限:
- 登录Azure Portal,找到函数应用对应的AAD注册(在「应用注册」中搜索你的函数应用名称)
- 进入「API权限」→「添加权限」→选择「Microsoft Graph」→「应用权限」
- 搜索并添加
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
相关产品推荐
相关产品推荐

