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

.NET Core下Newtonsoft Schema解析私有Azure Blob容器Schema方案咨询

可行解决方案:自定义JSchemaResolver实现Azure AD身份认证

你可以通过继承Newtonsoft.Json.Schema的JSchemaResolver抽象类,自定义适配Azure Blob存储身份认证逻辑的解析器,无需提前通过Azure SDK下载全量Schema文件,解析过程中会自动按需加载根Schema引用的所有子Schema。

实现步骤

  • 依赖安装:需要安装两个NuGet包:Azure.Identity(用于获取Azure AD访问令牌,自动适配本地开发身份、生产托管身份等多种场景)、Newtonsoft.Json.Schema
  • 自定义解析器代码示例:
using Azure.Core;
using Azure.Identity;
using Newtonsoft.Json.Schema;
using System.Net.Http.Headers;

public class AzureBlobSchemaResolver : JSchemaResolver
{
    private static readonly TokenCredential _credential = new DefaultAzureCredential();
    private static readonly HttpClient _httpClient = new HttpClient();
    private static readonly string[] _storageScopes = { "https://storage.azure.com/.default" };
    private AccessToken _cachedToken;

    public override object GetSchemaResource(Uri uri)
    {
        // 仅对Azure Blob URI添加Azure AD认证,其他URI走默认逻辑
        if (uri.Host.EndsWith(".blob.core.windows.net", StringComparison.OrdinalIgnoreCase))
        {
            // 令牌过期前5分钟自动刷新
            if (_cachedToken.ExpiresOn <= DateTimeOffset.UtcNow.AddMinutes(5))
            {
                _cachedToken = _credential.GetToken(new TokenRequestContext(_storageScopes), default);
            }

            using var request = new HttpRequestMessage(HttpMethod.Get, uri);
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _cachedToken.Token);
            
            var response = _httpClient.Send(request);
            response.EnsureSuccessStatusCode();
            return response.Content.ReadAsStream();
        }

        // 非Blob URI使用默认解析逻辑
        return base.GetSchemaResource(uri);
    }
}
  • 使用示例:
// 替换为你的私有Blob存储的根Schema地址
var rootSchemaUri = new Uri("https://<存储账户名>.blob.core.windows.net/<容器名>/root.schema.json");
var resolver = new AzureBlobSchemaResolver();

// 加载根Schema并自动解析所有关联的子Schema
var rootSchema = JSchema.Load(new JsonTextReader(new StreamReader(resolver.GetSchemaResource(rootSchemaUri))), resolver);

权限配置

需要给你的应用使用的托管身份/用户账号分配目标存储账户的Storage Blob Data Reader角色权限,否则会返回403错误。

替代方案:扩展默认JSchemaUrlResolver

如果你不想完全自定义Resolver,也可以通过构造带认证拦截的HttpClient注入到默认JSchemaUrlResolver中实现:

  • 实现一个DelegatingHandler,自动给发往Blob存储域名的请求加Azure AD Authorization头
  • 用这个Handler构造HttpClient,传入JSchemaUrlResolver(HttpClient)构造函数即可直接使用默认解析器的能力

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:06:04