Постоянный вход в Microsoft-Graph c # SDK - PullRequest
0 голосов
/ 18 сентября 2018

Я использую Microsoft Graph C # .NET SDK для доступа к почтовому ящику пользователя.Проблема в том, что когда я выполняю аутентификацию, токен, который Microsoft отправляет мне обратно, действителен только в течение примерно одного часа, и срок его действия истекает так рано.Но это так раздражает, когда пользователь регистрируется каждые 1 час, просто чтобы увидеть почтовый ящик Outlook.Мне нужно сделать этот логин ПЕРСИСТЕНТНЫМ.

Вот код, который я использую:

 public static async Task Run()
            {
                string secret = "MyDamnPrivateSecret";
                PublicClientApplication clientApp = new PublicClientApplication(secret);
                GraphServiceClient graphClient = new GraphServiceClient("https://graph.microsoft.com/v1.0", new DelegateAuthenticationProvider(async (requestMessage) =>
                {
                    requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", await GetTokenAsync(clientApp));
                }));
//Processing mailbox ...
            }

    private static async Task<string> GetTokenAsync(PublicClientApplication clientApp)
        {
            if (string.IsNullOrEmpty(Properties.Settings.Default.token) || string.IsNullOrWhiteSpace(Properties.Settings.Default.token))
            {
                //need to pass scope of activity to get token  
                string[] Scopes = { "User.Read", "Mail.ReadWrite" };
            string token = null;
            AuthenticationResult authResult = await clientApp.AcquireTokenAsync(Scopes);
            token = authResult.AccessToken;
            Properties.Settings.Default.token = token;
            Properties.Settings.Default.Save();
            return token;
            }
            else
            {
                return Properties.Settings.Default.token;
            }

        }

Есть ли способ продлить срок действия?Или сделать токен обновления или что-то, чтобы сохранить логин?

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

В вашем коде AcquireTokenAsync всегда вызывает вход в систему.

Вместо этого вам необходимо реализовать кэш токена и использовать AcquireTokenSilentAsync.

Для получения дополнительной информации, пожалуйста, просмотрите следующую информациюссылка:

Microsoft Graph SDK - Логин

0 голосов
/ 23 сентября 2018

Я постараюсь прояснить вопросы здесь:

  1. MSAL .net предназначен для различных платформ - .net для рабочего стола, .net core, UWP, xamarin android и xamarin iOS.На некоторых из этих платформ (UWP и xamarin) мы сохраняем кеш токенов для вас.Что касается остальных, мы ожидаем, что вы сохраните кеш.Причина в том, что мы не можем предоставить логику сериализации токенов, которая хорошо работает для всех сценариев (например, ферм серверов ASP.NET), поэтому мы ожидаем, что вы это сделаете.Мы предоставляем образцы и рекомендации по этому вопросу.Подробности и некоторые справочные реализации в MSAL wiki :

  2. Пример кода, предоставленный @Michael, подходит для MSAL v1.В MSAL v2 все немного по-другому, и вы можете найти шаблон вызова также на MSAL wiki :

  3. Мы запрашиваем и храним токен обновления (РТ).Если срок действия аутентификационного токена (AT) истек, мы запросим новый на основе RT - это произойдет без взаимодействия с пользователем.Все это должно быть прозрачным для вас, то есть должно работать :).Убедитесь, что сериализация кеша вашего токена работает, т.е. вы получаете учетную запись при выполнении

// perform an interactive login first 
// otherwise there will be no AT / RT in the store
var accounts = await app.GetAccountsAsync();
// there should be an account that you can use
Большинство наших примеров показывают, как вызывать график.Смотрите все примеры по сценарию здесь .Для вашего случая использования я рекомендую вам проверить Вызов графика из приложения WPF

Также ознакомьтесь с ответом @Daniel Dobalian об истечении срока действия AT и RT по умолчанию: MSALтокен истекает через 1 час

0 голосов
/ 19 сентября 2018

Вам потребуется запросить offline_access scope , чтобы получить токен обновления.Если вы используете более старую версию MSAL, вам нужно внедрить и передать кэш token в конструкторе PublicClientApplication, который, я думаю, MSAL будет использовать для автоматического обновления токена доступа.Я думаю, что более новая версия обрабатывает tokenCache для вас.

Из документов это рекомендуемый шаблон вызова: сначала попытайтесь вызвать AcquireTokenSilentAsync, а в случае сбоя с MsalUiRequiredException вызовите AcquireTokenAsync.

private static async Task<string> GetTokenAsync(PublicClientApplication clientApp)
    {
        AuthenticationResult result = null;

        try
        {
            string[] scopes = { "User.Read", "Mail.ReadWrite", "offline_access" };
            // Get the token from the cache.
            result = await app.AcquireTokenSilentAsync(scopes, clientApp.Users.FirstOrDefault());
            return result.AccessToken;
        }
        catch (MsalUiRequiredException ex)
        {
            // A MsalUiRequiredException happened on AcquireTokenSilentAsync. 
            // This indicates you need to call AcquireTokenAsync to acquire a token
            System.Diagnostics.Debug.WriteLine($"MsalUiRequiredException: {ex.Message}");

            try
            {
                // Dialog opens for user.
                result = await app.AcquireTokenAsync(scopes);
                return result.AccessToken;
            }
            catch (MsalException msalex)
            {
                ResultText.Text = $"Error Acquiring Token:{System.Environment.NewLine}{msalex}";
            }
        }
        catch (Exception ex)
        {
            ResultText.Text = $"Error Acquiring Token Silently:{System.Environment.NewLine}{ex}";
            return;
        }
    }

ВотОбразец для справки.https://github.com/Azure-Samples/active-directory-dotnet-desktop-msgraph-v2

...