如何在.NET桌面应用中通过REST API/.NET SDK增删Azure存储防火墙允许IP
Hey there! 我刚好有过类似的开发经验,给你分享两种可行的方案——用Azure .NET SDK或者直接调用REST API,都能实现存储账户防火墙IP的增删操作:
使用Azure .NET SDK实现(推荐)
这是最省心的方式,SDK会帮你处理身份验证、请求签名和资源序列化等细节,不用自己造轮子。
第一步:安装必要的NuGet包
先在项目里安装最新的Azure资源管理SDK和身份验证包:
Install-Package Azure.ResourceManager.Storage Install-Package Azure.Identity
第二步:编写增删IP规则的代码
下面是完整的示例代码,包含获取现有规则、新增IP、删除指定IP,最后提交更新的流程:
using Azure.Identity; using Azure.ResourceManager.Storage; using Azure.ResourceManager.Storage.Models; // 1. 初始化ArmClient(用DefaultAzureCredential适配本地开发和生产环境) var armClient = new ArmClient(new DefaultAzureCredential()); // 2. 替换成你的订阅ID、资源组名、存储账户名 string subscriptionId = "你的订阅ID"; string resourceGroupName = "你的资源组名"; string storageAccountName = "你的存储账户名"; // 3. 获取目标存储账户的资源引用 var storageAccountResourceId = StorageAccountResource.CreateResourceIdentifier(subscriptionId, resourceGroupName, storageAccountName); var storageAccount = armClient.GetStorageAccountResource(storageAccountResourceId); // 4. 获取当前的网络规则配置 var currentNetworkRules = await storageAccount.GetNetworkRuleSetAsync(); var existingIpRules = currentNetworkRules.Value.Properties.IpRules.ToList(); // --- 新增IP规则示例 --- // 添加单个IP地址 existingIpRules.Add(new IpRule("203.0.113.10", Action.Allow)); // 添加IP范围 existingIpRules.Add(new IpRule("192.168.0.0/24", Action.Allow)); // --- 删除IP规则示例 --- // 根据IP地址/范围删除指定规则 existingIpRules.RemoveAll(rule => rule.IpAddressOrRange == "192.168.0.0/24"); // 5. 构建更新参数(注意:必须保留原有其他规则,比如虚拟网络规则,否则会被清空) var updateParams = new StorageAccountNetworkRuleSetUpdate { IpRules = existingIpRules, // 保留原有的默认动作和虚拟网络规则 DefaultAction = currentNetworkRules.Value.Properties.DefaultAction, VirtualNetworkRules = currentNetworkRules.Value.Properties.VirtualNetworkRules }; // 6. 提交更新,等待操作完成 await storageAccount.UpdateNetworkRuleSetAsync(WaitUntil.Completed, updateParams);
权限说明
确保你的应用程序拥有足够的权限:比如分配Storage Account Contributor角色,或者自定义包含Microsoft.Storage/storageAccounts/networkRuleSets/write操作的权限。
使用REST API实现
如果不想依赖SDK,也可以直接调用Azure Resource Manager的REST API来操作。
请求详情
- 请求方法:PUT
- 请求URL:
https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{accountName}/networkRuleSets/default?api-version=2023-01-01 - 请求头:需要携带Azure AD颁发的Bearer令牌
- 请求体:必须包含所有现有规则(否则会覆盖清空),示例如下:
{ "properties": { "defaultAction": "Deny", "ipRules": [ { "value": "203.0.113.10", "action": "Allow" }, { "value": "192.168.0.0/24", "action": "Allow" } ], "virtualNetworkRules": [] // 这里保留原有的虚拟网络规则,没有的话留空数组 } }
.NET调用示例
using System.Net.Http; using System.Net.Http.Headers; using System.Text.Json; using Azure.Identity; var subscriptionId = "你的订阅ID"; var resourceGroupName = "你的资源组名"; var storageAccountName = "你的存储账户名"; var apiVersion = "2023-01-01"; // 获取Azure AD令牌 var credential = new DefaultAzureCredential(); var token = await credential.GetTokenAsync(new Azure.Core.TokenRequestContext(new[] { "https://management.azure.com/.default" })); // 构建HTTP请求 using var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Token); var requestUrl = $"https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{storageAccountName}/networkRuleSets/default?api-version={apiVersion}"; // 构造请求体(注意保留所有现有规则) var requestBody = new { properties = new { defaultAction = "Deny", ipRules = new[] { new { value = "203.0.113.10", action = "Allow" }, new { value = "192.168.0.0/24", action = "Allow" } }, virtualNetworkRules = new object[] { } } }; var jsonContent = JsonSerializer.Serialize(requestBody); var content = new StringContent(jsonContent, System.Text.Encoding.UTF8, "application/json"); // 发送请求并验证结果 var response = await client.PutAsync(requestUrl, content); response.EnsureSuccessStatusCode();
关键注意事项
- 不管用SDK还是REST API,更新时必须包含所有现有规则,否则未提及的规则会被自动清空
- 确保存储账户已经启用SMB over Internet,否则即使添加了IP规则,客户也无法通过互联网访问SMB
内容的提问来源于stack exchange,提问作者Illbegood73
相关产品推荐
相关产品推荐

