Получите токен Azure от контроллера .Net Core 2.0 (Bearer)

Это мой код startup.cs

services.AddAuthentication(sharedOptions =>
{
    sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddAzureAdBearer(configureOptions =>
{
    configureOptions.Instance = Environment.GetEnvironmentVariable("AD_Instance");
    configureOptions.Domain = Environment.GetEnvironmentVariable("AD_Domain");
    configureOptions.TenantId = Environment.GetEnvironmentVariable("AD_TenantId");
    configureOptions.ClientId = Environment.GetEnvironmentVariable("AD_ClientId");
}

JwtBearerDefaults.AuthenticationScheme является носителем

Это мои варианты:

public void Configure(string name, JwtBearerOptions options)
{
    options.Audience = _azureOptions.ClientId;
    options.Authority = $"{_azureOptions.Instance}{_azureOptions.TenantId}";
    options.TokenValidationParameters = new TokenValidationParameters()
    {
        ValidateIssuer = false
    };
    options.SaveToken = true;
}

Теперь, согласно многим блогам и вопросам и ответам здесь, я использую этот код для извлечения токена: (кстати, приложение отлично работает уже более 6 месяцев, не рассматривайте некоторые проблемы с настройкой)

var token = _httpContextAccessor.HttpContext.GetTokenAsync("access_token");

И вот что он возвращает:

Нажмите, чтобы увидеть изображение

Что мне нужно, так это access_token. бывший. Предъявитель eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1...

ОБНОВЛЕНИЕ: после того, как я увидел комментарии/ответы, я добавил await, но в результате получил null.


person Saso    schedule 30.03.2018    source источник
comment
вам нужно ждать var token =await _httpContextAccessor.HttpContext.GetTokenAsync("access_token") или ждать синхронно var token =_httpContextAccessor.HttpContext.GetTokenAsync("access_token").GetAwaiter().GetResult()   -  person Dmitry Pavliv    schedule 30.03.2018
comment
это асинхронный метод, токен может быть еще недоступен при его отладке. Используйте ожидание перед   -  person Niladri    schedule 30.03.2018
comment
Да, вы правы, я как-то пропустил это, я добавил await, но в результате получил null. Любая идея, почему это?   -  person Saso    schedule 02.04.2018
comment
Вам необходимо обновить свой вопрос с обновленным кодом и обновленными снимками экрана.   -  person Scott Chamberlain    schedule 02.04.2018


Ответы (1)


Метод GetTokenAsync("access_token") является асинхронным и возвращает результат System.Threading.Tasks.Task<string>. Итак, var здесь переводится как:

Task<string> token = _httpContextAccessor.HttpContext.GetTokenAsync("access_token");

Чтобы получить доступ к фактическому результату, вам нужно распаковать его из Task. Самый простой способ сделать это — использовать ключевое слово await:

string token = await _httpContextAccessor.HttpContext.GetTokenAsync("access_token");
person Marc LaFleur    schedule 30.03.2018
comment
Спасибо за расширенный ответ @marc-lafleur, и да, вы правы, я как-то пропустил это, я добавил ожидание, но в результате получил нуль. Любая идея, почему это? - person Saso; 02.04.2018