ADB2C - Обработка ошибки «Нулевой пользователь был передан в AcquiretokenSilent API» при истечении срока действия кэша токена - PullRequest
0 голосов
/ 24 января 2019

Мне удалось настроить мое приложение для аутентификации с использованием ADB2C, и, похоже, оно работает нормально. Реализованный код ADB2C представляет собой один из примеров Microsoft, в котором они используют класс SessionTokenCache для управления экземплярами TokenCache. В моем приложении я получаю токен доступа следующим образом:

private async Task<string> _getAccessToken(IConfidentialClientCredentials credentials)
        {
            if (this.HasCredentials())
            {
                var clientCredential = new ClientCredential(credentials.ClientSecret);
                var userId = this._getUserIdClaimValue();

                var tokenCache = new SessionTokenCache(_httpContextResolver.Context, userId);                

                var confidentialClientApplication = new ConfidentialClientApplication(
                    credentials.ClientId,
                    credentials.Authority,
                    credentials.RedirectUri,
                    clientCredential,
                    tokenCache.GetInstance(),
                    null);

                IAccount account = confidentialClientApplication.GetAccountsAsync().Result.FirstOrDefault();
                if (account == null)
                {
                    return "";
                }

                var authenticationResult = await confidentialClientApplication.AcquireTokenSilentAsync(
                    credentials.ApiScopes.Split(' '),
                    account,
                    credentials.Authority,
                    false);

                return authenticationResult.AccessToken;
            }
            else
            {
                return "";
            }
        }

Этот метод используется для получения токена доступа и передачи его в заголовок запроса HttpClient следующим образом:

...

 using (var request = new HttpRequestMessage(HttpMethod.Get, address.AbsoluteUri))
            {
                if (this.HasCredentials())
                {
                    string accessToken = await this._getAccessToken(_confidentialClientCredentials);

                    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
                }

                using (HttpResponseMessage response = await this.SendAsync(request))
                {
                    //result-processing logic
                }
...

Проблема заключается в том, что при перезапуске приложения пользователь остается аутентифицированным через файл cookie ADB2C, но confidentialClientApplication.GetAccountsAsync().Result.FirstOrDefault(); возвращает ноль. Это, вероятно, происходит из-за того, что кеш токена уничтожается при перезапуске приложения, поэтому я могу использовать кеш Redis для исправления.

Моя главная проблема, однако, заключается в том, как справиться с ситуацией, когда у вас есть нулевая учетная запись, но в то же время она проходит проверку подлинности. Как мои запросы к моему веб-сайту проходят проверку подлинности, даже если у меня нулевая учетная запись? Не должно ли это произойти и перенаправить меня на страницу входа, например?

Я попытался просмотреть фильтры авторизации и использовать следующий код, чтобы подключиться к процессу аутентификации и проверить, есть ли в нуле пользователь, но безрезультатно. Следующие события не вызываются никогда (это в ConfigureServices):

services.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)            
            .AddAzureADB2C(options => Configuration.Bind("ActiveDirectoryB2C", options))
            .AddAzureADB2CBearer(options => Configuration.Bind("ActiveDirectoryB2C", options))
            .AddCookie((options) => new CookieAuthenticationOptions
            {
                Events = new CookieAuthenticationEvents
                {
                    OnValidatePrincipal = context =>
                    {
                        // context.Principal gives you access to the logged-in user
                        // context.Properties.GetTokens() gives you access to all the tokens

                        return Task.CompletedTask;
                    },
                    OnSignedIn = context =>
                    {
                        return Task.CompletedTask;
                    }
                }
            });

Все это кажется мне слишком отвлеченным, чтобы понять, что происходит. Либо это, либо я упускаю что-то фундаментальное.

Примечание: ошибка " Нулевой пользователь был передан в AcquiretokenSilent API. Передайте объект пользователя или вызов acquToken authenticate. "выдается, если я пытаюсь передать нулевую учетную запись методу confidentialClientApplication.AcquireTokenSilentAsync().

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