如何使用SAS对Azure ArmClient进行身份验证?
用SAS令牌对ArmClient进行身份验证
由于Azure SDK没有直接提供将SAS令牌转换为TokenCredential的内置实现,你需要自定义一个TokenCredential子类来包装SAS令牌,以此满足ArmClient的参数要求。
步骤1:自定义SAS令牌凭证类
实现TokenCredential的两个核心方法,解析SAS令牌中的过期时间并返回包含令牌内容的AccessToken:
using Azure.Core; using System; using System.Threading; using System.Threading.Tasks; public class SasTokenCredential : TokenCredential { private readonly string _sasToken; private readonly DateTimeOffset _expiresOn; public SasTokenCredential(string sasToken) { _sasToken = sasToken ?? throw new ArgumentNullException(nameof(sasToken)); // 解析SAS令牌中的过期时间(se参数) var tokenSegments = sasToken.Split('&'); foreach (var segment in tokenSegments) { if (segment.StartsWith("se=", StringComparison.OrdinalIgnoreCase)) { if (long.TryParse(segment.Substring(3), out var epochSeconds)) { _expiresOn = DateTimeOffset.FromUnixTimeSeconds(epochSeconds); break; } } } // 如果未解析到过期时间,设置默认有效期(当前时间+1小时) if (_expiresOn == default) { _expiresOn = DateTimeOffset.UtcNow.AddHours(1); } } public override AccessToken GetToken(TokenRequestContext requestContext, CancellationToken cancellationToken) { return new AccessToken(_sasToken, _expiresOn); } public override ValueTask<AccessToken> GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken) { return new ValueTask<AccessToken>(GetToken(requestContext, cancellationToken)); } }
步骤2:使用自定义凭证初始化ArmClient
用你的SAS令牌实例化自定义凭证,再传入ArmClient的构造函数:
// 你的SAS令牌 string sasToken = $"SharedAccessSignature sr={url}&sig={sig}&se={exp}&skn={sharedAccessKeyName}"; // 创建SAS凭证实例 var sasCredential = new SasTokenCredential(sasToken); // 初始化ArmClient(替换为实际租户ID) var armClient = new ArmClient(sasCredential, "your-tenant-id");
注意事项
- 确保SAS令牌的权限范围(
sr参数指定的资源)和签名(sig)足够覆盖你要通过ArmClient执行的操作,否则会返回权限不足的错误。 - 若SAS令牌中没有
se参数,可根据业务场景调整过期时间的默认逻辑,比如设置更短的有效期避免令牌长期无效。
内容的提问来源于stack exchange,提问作者ed22
相关产品推荐
相关产品推荐

