Я написал базовую программу на C# для тестирования Microsoft Graph API, но для этого я настроил разрешение для вызовов API с портала Azure. Есть ли лучший способ сделать это? любой динамический способ настройки разрешений API в зависимости от вызовов API, которые я добавляю в код, а не настраиваю их вручную на портале Azure.
GraphHandler.cs
public class GraphHandler
{
public GraphServiceClient GraphClient { get; private set; }
public GraphHandler(string tenantId, string clientId, string clientSecret)
{
GraphClient = CreateGraphClient(tenantId, clientId, clientSecret);
}
public GraphServiceClient CreateGraphClient(string tenantId, string clientId, string clientSecret)
{
var options = new TokenCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
var clientSecretCredential = new ClientSecretCredential(
tenantId, clientId, clientSecret, options);
var scopes = new[] { "https://graph.microsoft.com/.default" };
return new GraphServiceClient(clientSecretCredential, scopes);
}
public async Task GetUser(string userPrincipalName)
{
return await GraphClient.Users[userPrincipalName].GetAsync();
}
public async Task GetSharepointSites()
{
var sites = (await GraphClient.Sites.GetAllSites.GetAsync())?.Value;
if(sites == null)
{
return (null, null);
}
sites.RemoveAll(x => string.IsNullOrEmpty(x.DisplayName));
var spSites = new List();
var oneDriveSites = new List();
foreach (var site in sites)
{
if (site == null) continue;
var compare = site.WebUrl?.Split(site.SiteCollection?.Hostname)[1].Split("/");
if (compare.All(x => !string.IsNullOrEmpty(x)) || compare.Length < 1)
{
continue;
}
if (compare[1] == "sites" || string.IsNullOrEmpty(compare[1]))
spSites.Add(site);
else if (compare[1] == "personal")
oneDriveSites.Add(site);
}
return (spSites, oneDriveSites);
}
}
Program.cs
string tenantId = "INPUT TENANT ID";
string clientId = "INPUT CLIENT ID";
string clientSecret = "INPUT CLIENT SECRET";
var graphHandler = new GraphHandler(tenantId, clientId, clientSecret);
Console.WriteLine("Get display name of user:");
var user = await graphHandler.GetUser("mail@example.com");
Console.WriteLine(user?.DisplayName);
Console.WriteLine("Get all sharepoint sites in tenant");
var spSites = (await graphHandler.GetSharepointSites()).Item1;
foreach (var site in spSites)
{
Console.WriteLine(site.DisplayName);
}
Console.ReadLine();
Подробнее здесь: https://stackoverflow.com/questions/785 ... ynamically