【问题标题】:How to remotely update azure webapp firewall with local IP via powershell or C#如何通过 powershell 或 C# 使用本地 IP 远程更新 azure webapp 防火墙
【发布时间】:2018-03-18 21:53:16
【问题描述】:

如何使用本地 PC IP 地址远程更新我的 azure webapp 防火墙,以便通过 powershell 或 C# 进行管理。

我已经查看了文档,但我只能从实际的服务器本身而不是远程找到如何做到这一点。

我可以让visual studio弹出并询问我是否想将我的IP地址随机添加到防火墙,但大多数时候它只是失败并且没有询问我,所以我正在寻找手动记录以外的解决方案每当我的 IP 地址发生变化时进入 Azure 门户。

寻找示例或文档链接,以显示要使用的库。

更新:我尝试了 Tom Suns 的回答,但是我们使用的是 Web 应用程序而不是 sql 服务器,所以它不起作用。

azure.WebApps.GetByResourceGroup("resourcegroup","webapp")

返回网络应用程序,但无论如何我都找不到以编程方式访问此网络应用程序网络下的“访问限制”。

我也只能访问此 Web 应用的主部署槽。我需要为每个部署槽单独设置防火墙(可以通过 azure Web 界面完成)。

我尝试通过以下名称访问第二个部署槽,均返回 null。这是假设 web 应用程序被命名为“webapp”并且部署槽被命名为“slo1”

webapp-slot1 webapp_slot1 webapp/slot1

我也尝试过 GetByID 而不是 GetByResourceGroup,但是我找不到任何关于他的 ID 是什么以及在哪里可以找到它的示例。我已经尝试了几乎可以在 azure Web UI 上找到的每一个 ID。

最后,Tom Sun 的回答要求将硬编码凭据存储在驱动器上。这远非最佳。我更喜欢弹出式 UI,提示用户输入他们的用户名和密码,这在旧版本的 API 中是可能的,但我能找到的一切都表明它不再是。我可能不得不求助于 powershell。

【问题讨论】:

  • 你有关于这个线程的任何更新吗?如果有用,请点赞,方便更多有相同问题的社区轻松搜索。
  • @TomSun-MSFT 我终于回来尝试这个,但我无法让任何解决方案发挥作用。

标签: c# powershell azure azure-sql-database firewall


【解决方案1】:

我们可以使用Microsoft.Azure.Management.FluentMicrosoft.Azure.Management.ResourceManager.Fluent 来做到这一点,有关库的更多详细信息,请参阅packages.config。我们还可以从github 获得更多demo code。在编码之前,我们需要注册一个 Azure AD 应用程序并为其分配相应的角色,更多详细信息请参考document。然后我们可以从 Azure AD App 中获取 clientId、key(secret key) 和tenant。之后我们可以使用以下格式创建Auth file

subscription=########-####-####-####-############
client=########-####-####-####-############
tenant=########-####-####-####-############
key=XXXXXXXXXXXXXXXX
managementURI=https\://management.core.windows.net/
baseURL=https\://management.azure.com/
authURL=https\://login.windows.net/
graphURL=https\://graph.windows.net/

演示代码:

 var credFile = @"File Path"; // example: c:\tom\auth.txt
            var resourceGroup = "resource group";
            var azureSQLServer = "Azure sql server name"; //just name of the Azure sql server such as tomdemo
            var firewallRull = "firewall rull name";//such as myFirewallRull
            var firewallRuleIPAddress = "x.x.x.x";//your Ip address
            var credentials = SdkContext.AzureCredentialsFactory.FromFile(credFile);
            var azure = Azure
                .Configure()
                .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
                .Authenticate(credentials)
                .WithDefaultSubscription();

            var sqlServer = azure.SqlServers.GetByResourceGroup(resourceGroup, azureSQLServer);
            var newFirewallRule = sqlServer.FirewallRules.Define(firewallRull)
                .WithIPAddress(firewallRuleIPAddress)
                .Create();

packages.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.Azure.KeyVault.Core" version="1.0.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.AppService.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.Batch.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.Cdn.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.Compute.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.ContainerInstance.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.ContainerRegistry.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.CosmosDB.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.Dns.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.Graph.RBAC.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.KeyVault.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.Network.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.Redis.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.ResourceManager.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.Search.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.ServiceBus.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.Sql.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.Storage.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Azure.Management.TrafficManager.Fluent" version="1.3.0" targetFramework="net461" />
  <package id="Microsoft.Data.Edm" version="5.8.2" targetFramework="net461" />
  <package id="Microsoft.Data.OData" version="5.8.2" targetFramework="net461" />
  <package id="Microsoft.Data.Services.Client" version="5.8.2" targetFramework="net461" />
  <package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="2.28.3" targetFramework="net461" />
  <package id="Microsoft.Rest.ClientRuntime" version="2.3.9" targetFramework="net461" />
  <package id="Microsoft.Rest.ClientRuntime.Azure" version="3.3.10" targetFramework="net461" />
  <package id="Microsoft.Rest.ClientRuntime.Azure.Authentication" version="2.3.1" targetFramework="net461" />
  <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net461" />
  <package id="System.ComponentModel.EventBasedAsync" version="4.0.11" targetFramework="net461" />
  <package id="System.Dynamic.Runtime" version="4.0.0" targetFramework="net461" />
  <package id="System.Linq.Queryable" version="4.0.0" targetFramework="net461" />
  <package id="System.Net.Requests" version="4.0.11" targetFramework="net461" />
  <package id="System.Spatial" version="5.8.2" targetFramework="net461" />
  <package id="WindowsAzure.Storage" version="8.1.4" targetFramework="net461" />
</packages>

【讨论】:

  • 凭据文件是身份验证文件的另一个名称吗?
  • credfile是auth文件的路径,包含auth文件名。
  • 这仅适用于 SQL Server。我有一个通过“azure.WebApps.GetByResourceGroup”访问的网络应用程序,但是我无法找到以编程方式修改该网络应用程序的“访问限制”的方法。我也找不到如何访问 Web 应用程序上的各个部署槽。我已经尝试过 webapp/deploymentslot webapp_deploymentslot webapp-deploymentslot 甚至直接通过 ID,但它总是返回 null。似乎只能访问主/主网络应用程序。
【解决方案2】:

对于 PowerShell,您需要使用 New-AzureRmSqlServerFirewallRule

来自link

New-AzureRmSqlServerFirewallRule -ResourceGroupName "myResourceGroup" -ServerName $servername -FirewallRuleName "AllowSome" -StartIpAddress "0.0.0.0" -EndIpAddress "0.0.0.0"

【讨论】:

  • 如何进行身份验证?它怎么知道我的 Azure 订阅用户名和密码?
  • 您将从Login-AzureRmAccount 开始进行身份验证。
  • @GauravMantri 当您通过 powershell 手动登录时,这将起作用。但可能对自动化没有帮助。
【解决方案3】:

从 C# 中,您可以像这样通过 Microsoft.Azure.Management.Fluent 访问所有 Azure 资源

// Create an authentication context to Azure and acquire a login token
var context = new AuthenticationContext("https://login.microsoftonline.com/tenantId");
var auth = await context.AcquireTokenAsync("https://management.core.windows.net/",
                    "yourClientId", new Uri("urn:ietf:wg:oauth:2.0:oob"),
                    new PlatformParameters(PromptBehavior.Always));
string token = auth.AccessToken;
var tokenCredentials = new TokenCredentials(token);
var azureCredentials = new AzureCredentials(tokenCredentials, tokenCredentials, 
                           AzureParts.Tenant, AzureEnvironment.AzureGlobalCloud);

// Build the client with the acquired token as a credential.
RestClient client = RestClient.Configure()
                .WithEnvironment(AzureEnvironment.AzureGlobalCloud)
                .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
                .WithCredentials(azureCredentials)
                .Build();

// Authenticate against azure with the correct subscription to access.
var azure = Azure.Authenticate(client, AzureParts.Tenant)
                .WithSubscription("subscriptionId");

// Search for the sql server and add a firewall rule.
var sqlServer = azure.SqlServers.GetByResourceGroup("ResourceGroup", "servername");
sqlServer.FirewallRules.Define("LetMeIn").WithIPAddress("yourIp").Create();

请注意,通过AcquireTokenAsync 获取登录令牌将打开一个登录窗口,因此不能以自动方式使用。如果您只想登录一次,可以提供一个带有已存储令牌的令牌缓存。

在没有令牌缓存的情况下检索令牌的更复杂示例(如果要添加令牌缓存,请参阅 AuthenticationContext 构造函数的重载):

var context = new AuthenticationContext("https://login.microsoftonline.com/<tenantId>", false);
AuthenticationResult authResult = null;

try
{
    authResult = await context.AcquireTokenSilentAsync("https://management.core.windows.net/", clientId);
}
catch (AdalSilentTokenAcquisitionException)
{
    authResult = await context.AcquireTokenAsync("https://management.core.windows.net/",
    clientId, new Uri("urn:ietf:wg:oauth:2.0:oob"),
    new PlatformParameters(PromptBehavior.Always));
}
string token = authResult.AccessToken;

【讨论】:

  • 您能否列出所有包,使用语句并显示您的 nuget 配置。当您必须花费 1 小时来弄清楚构建和工作需要什么环境(netstandard 或 netcore)什么 nuget 版本等时,这些答案可能真的令人沮丧。
  • 还有token从哪里来的?它甚至没有在你的例子中定义......
  • @rolls 我为令牌检索添加了一个更复杂的示例并修复了原始代码中丢失的令牌,您只需要 Microsoft.Azure.Management.Fluent 包。
  • 谢谢@GaussZ 是否可以修改示例以适用于 azure WebApp“访问限制”防火墙而不是 SQL 服务器?
  • @rolls 我目前没有用于测试的 Web 应用程序,但您应该可以从这里访问您需要的内容:(await azure.WebApps.GetByIdAsync("id")) .Inner.SiteConfig.IpSecurityRestrictions
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 2020-06-18
  • 2012-10-22
  • 2013-03-09
  • 2021-04-26
相关资源
最近更新 更多