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

启用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:18:00