Мне удалось настроить мое приложение для аутентификации с использованием 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()
.