Нужна помощь в демистификации новой функции, представленной в Microsoft.График 4.0.0

#azure #winforms #azure-active-directory #microsoft-graph-api #microsoft-graph-sdks

Вопрос:

Вопрос:

Я не уверен, подпадает ли это под вопрос или проверку кода, потому что код работает там, где я не знаю, правильно ли он реализован. Но нужно ли нам получать маркер доступа с Microsoft.Graph помощью одного silent interactive из режимов или? Из того, что я могу сказать, ответ-Нет. (см. Контекст ниже)

Новая реализация, по-видимому, резко сокращена, при этом вся идея silent извлечения токенов и interactive извлечения токенов удалена. Правильно ли это?

 using Azure.Identity;
using Microsoft.Graph;
using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var scopes = new[] { "User.Read" };

            // Multi-tenant apps can use "common",
            // single-tenant apps must use the tenant ID from the Azure portal
            var tenantId = "SomeGuid";

            // Value from app registration
            var clientId = "SomeGuid";

            var options = new InteractiveBrowserCredentialOptions
            {
                TenantId = tenantId,
                ClientId = clientId,
                AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
                // MUST be http://localhost or http://localhost:PORT
                // See https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/System-Browser-on-.Net-Core
                RedirectUri = new Uri("http://localhost:1234"),
            };

            // https://docs.microsoft.com/dotnet/api/azure.identity.interactivebrowsercredential
            var interactiveCredential = new InteractiveBrowserCredential(options);

            var graphClient = new GraphServiceClient(interactiveCredential, scopes);
            
            // Interactive browser login occurs here.
            var me = graphClient.Me.Request().GetAsync().Resu<

            // Printing the results
            Console.WriteLine("-------- Data from call to MS Graph --------");
            Console.Write(Environment.NewLine);
            Console.WriteLine($"Id: {me.Id}");
            Console.WriteLine($"Display Name: {me.DisplayName}");
            Console.WriteLine($"Email: {me.Mail}");
            //Console.ReadLine();
        }
    }
}
 

Контекст:

В рамках нашего текущего обслуживания мне было поручено обновить наши пакеты NuGet в настольном приложении Winforms, которое работает в Azure и пользователи которого находятся в службах Azure Active Directory (AADS). В одном из пакетов Microsoft.Graph произошло существенное изменение версии. https://www.nuget.org/packages/Microsoft.График/4.0.0

В документации по нему указывалась новая функция для обработки TokenCredentialClass . https://github.com/microsoftgraph/msgraph-sdk-dotnet/blob/4.0.0/docs/upgrade-to-v4.md#new-capabilities

Из того, что я могу сказать, есть отдельный и четкий разрыв в том, как извлекается токен. Ранее мы следовали методу, приведенному здесь: https://docs.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-windows-desktop#add-the-code-to-initialize-msal

Old way:

 using Microsoft.Graph;
using Microsoft.Graph.Auth;
using Microsoft.Identity.Client;
using System;
using System.Linq;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            _PublicClientApp = PublicClientApplicationBuilder.Create(ClientId)
                    .WithRedirectUri("http://localhost:1234")
                    .WithAuthority(AzureCloudInstance.AzurePublic, TenantId)
                    .Build();

            // We sign the user in here
            bolIsAutorizeSSO = CallMicrosoftSSO().GetAwaiter().GetResult();
            InteractiveAuthenticationProvider = new InteractiveAuthenticationProvider(PublicClientApp, Scopes);
            GraphServiceClient = new Microsoft.Graph.GraphServiceClient(InteractiveAuthenticationProvider);

            if (bolIsAutorizeSSO)
            {
                // We also signt the user in here.
                var User = GraphServiceClient.Me.Request().GetAsync().Resu<

                // Printing the results
                Console.WriteLine("-------- Data from call to MS Graph --------");
                Console.Write(Environment.NewLine);
                Console.WriteLine($"Id: {User.Id}");
                Console.WriteLine($"Display Name: {User.DisplayName}");
                Console.WriteLine($"Email: {User.Mail}");
            }
            else
            {
                // signout
                Console.ReadLine();
            }
        }

        public static async Task<bool> CallMicrosoftSSO()
        {
            AuthenticationResult authResult = null;
            var app = PublicClientApp;
            var accounts = await app.GetAccountsAsync();

            try
            {
                authResult = await app.AcquireTokenInteractive(Scopes)
                    .WithAccount(accounts.FirstOrDefault())
                    .WithPrompt(Microsoft.Identity.Client.Prompt.ForceLogin)
                    .ExecuteAsync();
            }
            catch (MsalUiRequiredException _Exception)
            {
                // A MsalUiRequiredException happened on AcquireTokenSilent. 
                // This indicates you need to call AcquireTokenInteractive to acquire a token.
                
                Console.WriteLine(_Exception.Message);
            }
            catch (MsalException msalex)
            {
                if (msalex.ErrorCode != "authentication_canceled")
                {
                    Console.WriteLine(msalex.Message);
                }
            }
            catch (Exception _Exception)
            {
                Console.WriteLine(_Exception.Message);
            }

            if (authResult != null)
            {
                return true;
            }
            return false;
        }

        private static string ClientId = "SomeGuid";
        private static string TenantId = "SomeGuid";
        private static string[] Scopes = new string[] { "User.Read" };
        private static Microsoft.Graph.GraphServiceClient GraphServiceClient;
        private static bool bolIsAutorizeSSO = false;
        private static InteractiveAuthenticationProvider InteractiveAuthenticationProvider;

        private static IPublicClientApplication _PublicClientApp;
        public static IPublicClientApplication PublicClientApp { get { return _PublicClientApp; } }
    }
}
 

Я изо всех сил пытаюсь разобраться в этом. Отчасти потому, что эта функция совершенно новая, и в Интернете очень мало примеров кода, которые говорят do it this way об этом . То, что я нашел, похоже, возвращает меня к тому, что мы уже используем (подробнее об этом чуть позже). Таким образом, примеры могут быть еще не полностью обновлены.