Получение ошибки «невозможно преобразовать» при попытке использовать кэшированный токен - PullRequest
0 голосов
/ 12 января 2020

Я получаю следующую ошибку при попытке использовать кэшированный токен. Я использую список, который был приведен в качестве примера: https://docs.microsoft.com/bs-latn-ba/azure/active-directory/develop/msal-net-acquire-token-silently

не может преобразовать из 'System.Collections.Generi c .IEnumerable' в 'Microsoft .Identity.Client.IAccount'`

        static async Task<GraphServiceClient> Auth()
        {

            var clientApp = PublicClientApplicationBuilder.Create(ConfigurationManager.AppSettings["clientId"]).Build();
            string[] scopes = new string[] { "user.read" };
            string token = null;
            var app = PublicClientApplicationBuilder.Create(ConfigurationManager.AppSettings["clientId"]).Build();
            AuthenticationResult result = null;
            var accounts = await app.GetAccountsAsync();

                result = await app.AcquireTokenSilent(scopes, accounts)
                       .ExecuteAsync();
                token = result.AccessToken;

            GraphServiceClient graphClient = new GraphServiceClient(
                        "https://graph.microsoft.com/v1.0",
                        new DelegateAuthenticationProvider(
                            async (requestMessage) =>
                            {
                                requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", token);
                            }));
            return graphClient;
        }

1 Ответ

1 голос
/ 12 января 2020

Вызов, который вызывает ошибку:

result = await app.AcquireTokenSilent(scopes, accounts)
                  .ExecuteAsync();

AcquireTokenSilent требует двух переменных: IEnumerable<String> (scops) и string (loginHint). То, что вы принимаете за loginHist - это массив учетных записей, когда предполагается, что это одна строка (одна учетная запись).

var accounts = await app.GetAccountsAsync();

GetAccountsAsyn c () return тип IEnumerable, поэтому он выдает ошибку при этом вызове.

В примере здесь учетная запись была найдена в списке.

// Get the account
IAccount account = await application.GetAccountAsync(accountIdentifier).ConfigureAwait(false);

// Special case for guest users as the Guest oid / tenant id are not surfaced.
if (account == null)
{
    if (loginHint == null)
        throw new ArgumentNullException(nameof(loginHint));

    var accounts = await application.GetAccountsAsync().ConfigureAwait(false);
    account = accounts.FirstOrDefault(a => a.Username == loginHint);
}

Добавьте эту строку в свой код:

var accounts = await app.GetAccountsAsync();
IAccount account = accounts.FirstOrDefault(a => a.Username == loginHint); // <--- Get Account from accounts
result = await app.AcquireTokenSilent(scopes, account) // Use account instead of accounts.
                  .ExecuteAsync();
token = result.AccessToken;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...