启用Easy Auth的.NET Core HTTP Trigger Azure Function如何获取请求身份的Object ID
解决方案
Azure App Service 内置的 Easy Auth(即 App Service 认证)会在网关层完成身份校验后,自动将身份信息注入到请求上下文,针对你使用的 .NET Core 3.1 版本 HTTP 触发型 Azure Function,有两种可直接落地的实现方案:
方式1:从请求头读取编码后的身份信息
Easy Auth 会将校验通过的身份声明以 Base64 编码的 JSON 格式存放到 X-MS-CLIENT-PRINCIPAL 请求头,直接解码解析即可拿到 Object Id(对应声明类型为 oid):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.Json; using System.Text.Json.Serialization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.Extensions.Logging; public static class GetObjectIdFunction { [FunctionName("GetObjectId")] public static IActionResult Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, ILogger log) { // 无身份头说明请求未通过Easy Auth校验 if (!req.Headers.TryGetValue("X-MS-CLIENT-PRINCIPAL", out var principalHeader)) { return new UnauthorizedResult(); } // 解码Base64格式的身份信息 var decodedJson = Encoding.UTF8.GetString(Convert.FromBase64String(principalHeader)); var clientPrincipal = JsonSerializer.Deserialize<ClientPrincipal>(decodedJson); // 提取oid声明即对应身份的Object Id var objectId = clientPrincipal?.Claims?.FirstOrDefault(c => c.Type == "oid")?.Value; if (string.IsNullOrEmpty(objectId)) { return new BadRequestObjectResult("未获取到有效身份的Object Id"); } return new OkObjectResult(new { ObjectId = objectId }); } // 反序列化专用类 private class ClientPrincipal { [JsonPropertyName("claims")] public IEnumerable<ClientPrincipalClaim> Claims { get; set; } } private class ClientPrincipalClaim { [JsonPropertyName("typ")] public string Type { get; set; } [JsonPropertyName("val")] public string Value { get; set; } } }
- 此处将Function的授权等级设为
Anonymous不影响安全,无效身份的请求会被Easy Auth直接拦截,不会到达业务代码 oid声明同时适用于用户身份、服务主体/托管身份的场景,返回的都是对应AAD身份的Object Id
方式2:从HttpContext直接读取身份(代码更精简)
Azure Functions v3 运行时默认会将Easy Auth的身份信息自动填充到HttpContext.User的ClaimsPrincipal中,不需要手动解析请求头:
using System.Security.Claims; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.Extensions.Logging; public static class GetObjectIdFunction { [FunctionName("GetObjectId")] public static IActionResult Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, ILogger log) { var objectId = req.HttpContext.User.FindFirstValue("oid"); if (string.IsNullOrEmpty(objectId)) { return new UnauthorizedResult(); } return new OkObjectResult(new { ObjectId = objectId }); } }
- 需提前引入
System.Security.Claims命名空间 - 仅支持Azure Functions v3运行时,和.NET Core 3.1版本适配性最佳,无需额外配置即可使用
注意:如果你的Function同时开启了自带的密钥认证和Easy Auth,请求需要同时满足两个认证规则才能访问,建议优先将Function授权等级设为
Anonymous,统一由Easy Auth负责身份校验。
内容的提问来源于stack exchange,提问作者qvt
相关产品推荐
相关产品推荐

