Une petite Azure Function simple, que je pose ici pour la retrouver en cas de besoin.
Etape 1 – Authentification
public static async Task<string> GetAccessTokenAsync(string resource)
{
var azureServiceTokenProvider = new AzureServiceTokenProvider();
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync(resource);
return accessToken;
}
Une authentification MSI comme on les aime, cela permettra de donner les droits au service Azure Function directement !
Etape 2 – Vider les rôles
[FunctionName("drop-roles")]
public static async Task<HttpResponseMessage> DropRoles([HttpTrigger(AuthorizationLevel.Function, "get", Route = "drop-roles/{region}/{servername}/{database}")]HttpRequestMessage req, ILogger log, string region, string servername, string database)
{
try
{
string connectionString = "Provider=MSOLAP;Data Source=asazure://" + region + ".asazure.windows.net/" + servername + ";User ID=;Password={0};Persist Security Info=True;Impersonation Level=Impersonate";
connectionString = string.Format(CultureInfo.InvariantCulture, connectionString, await GetAccessTokenAsync("https://*.asazure.windows.net"));
Server server = new Server();
server.Connect(connectionString);
var db = server.Databases.FindByName(database);
db.Model.Roles.Clear();
var result = db.Model.SaveChanges();
return req.CreateResponse(HttpStatusCode.OK, result.XmlaResults);
}
catch (Exception e)
{
return req.CreateResponse(HttpStatusCode.InternalServerError, e.Message);
}
}
Quelques lignes d’AMO, on pensera à implémenter l’authentification Azure AD sur ces Azure Functions afin que celles-ci ne soit pas appelées par n’importe qui ayant la clé.