Microsoft Identity Platform - пользовательский кэш маркеров args. Счет всегда равен нулю - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть MVC веб-приложение, которое хочет отправлять электронные письма с одного адреса электронной почты с помощью Office365. Я вызываю API, чтобы он отображал страницу входа в microsoftonline для входа. При успешном входе я получаю код обратно из API и генерирую Microsoft.Identity.Client.AuthenticationResult с помощью кода и сохраняю tokenresponse.UniqueId и tokenresponse.Account.HomeAccountId.Identifier в база данных.

Я попал на следующую страницу и успешно вошел в систему, и моя база данных сохранила ответ. Sign In Page После этого я пытаюсь отправлять электронные письма, используя следующий код:

IConfidentialClientApplication mailer;

            var mailerbuilder = ConfidentialClientApplicationBuilder
                                        .Create(o365setpQry.ClientId))
                                        .WithAuthority(AzureCloudInstance.AzurePublic, o365setpQry.Tenant)
                                        .WithClientSecret(o365setpQry.ClientSecret);

            mailerbuilder.WithRedirectUri(O365OAuthRedirectURL);
            mailer = mailerbuilder.Build();                


            //user token cache.
            mailer.UserTokenCache.SetAfterAccess((args) => {

                Users user;
                if **(args.Account == null)** user = null;
                else user = _users.Table.Where(x => x.email_address == args.Account.Username).FirstOrDefault();

                if (user == null)
                {
                    var emsetp = _emsetp.Table.FirstOrDefault();
                    if (args.HasStateChanged || (emsetp.o365_GlobalTokenInfo == null))
                    {
                        emsetp.o365_GlobalTokenInfo = args.TokenCache.SerializeMsalV3();
                    }
                }
                else if (args.HasStateChanged || (user.o365_TokenInfo == null))
                {
                    user.o365_TokenInfo = args.TokenCache.SerializeMsalV3();
                    _users.Update(user);
                }

            });
            webEmailer.UserTokenCache.SetBeforeAccess((args) => {
                Users user;
                **if (args.Account == null)** user = null;
                else  user = _users.Table.Where(x => x.email_address == args.Account.Username).FirstOrDefault();

                if (user == null)
                {
                    args.TokenCache.DeserializeMsalV3(_emsetp.Table.FirstOrDefault().o365_GlobalTokenInfo);
                }
                else if (user.o365_TokenInfo != null)
                {
                    args.TokenCache.DeserializeMsalV3(user.o365_TokenInfo);
                }
            });

var t = mailer.GetAccountAsync(emsetp.FirstOrDefault().o365_GlobalToken);
                        t.Wait();
                        Microsoft.Identity.Client.IAccount acct = t.Result;

Args.Account всегда возвращает ноль.

var RequestClient = GraphClientFactory.Create(new DelegateAuthenticationProvider(new AuthenticateRequestAsyncDelegate((args) => {
                var tokenRequest = mailer.AcquireTokenSilent(scopes, acct).ExecuteAsync();
                tokenRequest.Wait();
                args.Headers.Authorization = new AuthenticationHeaderValue("Bearer", tokenRequest.Result.AccessToken);
                return System.Threading.Tasks.Task.FromResult(0);
            })));

            var graphClient = new GraphServiceClient(RequestClient);

            var t = graphClient.Me.SendMail(message, true).Request();
            var u = t.PostAsync();

Я сделал Убедитесь, что мои URL-адреса перенаправления совпадают, и я не получаю никаких ошибок от вызовов API, чтобы увидеть, что не так и что делает значение args.Account пустым, и, следовательно, я не могу отправлять электронные письма. Если я снова запрашиваю страницу входа, на ней все равно отображается учетная запись, с которой я вошел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...