C# で Azure Functions の CORS にドメインを登録

Azure SDK for .NET を使用して C# で Azure Functions の CORS にドメインを登録する方法をまとめます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603340/194a5d33-21cf-95c7-1286-90ec286e23f0.png)




## 事前準備

CORS の登録処理の認証に使用する AAD のアプリを用意し、クライアント ID、クライアントシークレット、テナント ID を取得しておきます。  
AAD のアプリは CORS 登録対象の Azure Functions か、Azure Functions のリソースグループにロールを割り当てておきます。
今回はリソースグループに「共同作成者」でロールを割り当てました。

次に、CORS の登録対象の Azure Functions のサブスクリプション ID を取得しておきます。

AAD アプリの情報、サブスクリプション ID を変数に設定しておきます。

``` csharp
var clientId = "{AAD アプリのクライアント ID}";
var clientSecret = "{AAD アプリのクライアントシークレット}";
var tenantId = "{AAD アプリのテナント ID}";
var subscriptionId = "{CORS の登録対象の Azure Functions のサブスクリプション ID}";
```



## 資格情報の作成

Nuget より `Microsoft.Azure.Management.ResourceManager.Fluent` をインストールします。

AAD のアプリの clientId, clientSecret, tenantId を使用して資格情報を作成します。

``` csharp
// credential の作成
var credentials = SdkContext.AzureCredentialsFactory
    .FromServicePrincipal(clientId, clientSecret, tenantId, AzureEnvironment.AzureGlobalCloud);
```

Azure SDK for .NET のリファレンスは[こちら](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.azure.management.resourcemanager.fluent.authentication?view=azure-dotnet)



## Azure オブジェクトの作成

Nuget より `Microsoft.Azure.Management.Fluent` をインストールします。

資格情報で作成した AzureCredentials オブジェクトと、サブスクリプション ID を使用して CORS を操作するための Azure オブジェクトを作成します。

``` csharp
// Azure オブジェクトの作成
var azure = Microsoft.Azure.Management.Fluent.Azure
            .Configure()
            .Authenticate(credentials)
            .WithSubscription(subscriptionId);
```

Azure SDK for .NET のリファレンス  

- [Azure](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.azure.management.fluent.azure?view=azure-dotnet)  
- [Azure.Authenticated](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.azure.management.fluent.azure.authenticated?view=azure-dotnet)



## CORS 一覧取得

リソースグループ名、FunctionApp 名を元に更新対象の FunctionApp の CORS の一覧を取得します。  
CORS 一覧は IList\<string\> 型で取得されます。

``` csharp
var functionAppName = "{CORS 登録対象の Azure Functions}";
var resourceGroupName = "{CORS 登録対象の Azure Functions のリソースグループ名}";

// WebApps の config を取得
var siteConfig = (await azure.WebApps.Inner.GetConfigurationWithHttpMessagesAsync(resourceGroupName, functionAppName)).Body;
// config から CORS の一覧を取得
var corsList = siteConfig.Cors.AllowedOrigins;
```

Azure SDK for .NET のリファレンスは[こちら](https://docs.microsoft.com/it-ch/dotnet/api/microsoft.azure.management.appservice.fluent.iwebappsoperations.getconfigurationwithhttpmessagesasync?view=azure-dotnet)



## CORS の登録

CORS の一覧に登録するドメインを追加し、WebApps の config を更新することで FunctionApp の CORS にドメインを登録することができます。

``` csharp
// COSR の一覧に登録するドメインを追加
var additionalDomain = "{登録するドメイン}";
corsList.Add(additionalDomain);

// CORS の一覧を設定
var newSiteConfig = new SiteConfigResourceInner() { Cors = new CorsSettings() };
newSiteConfig.Cors.AllowedOrigins = corsList;

// WebApps の config を更新
await azure.WebApps.Inner.CreateOrUpdateConfigurationWithHttpMessagesAsync(resourceGroupName, functionAppName, newSiteConfig);
```

Azure SDK for .NET のリファレンスは[こちら](https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.management.websites.iwebappsoperations.createorupdateconfigurationwithhttpmessagesasync?view=azure-dotnet)