Пользователь аутентифицирован после OpenId Connect (AAD), но не может найти токен доступа - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь найти токен доступа из AAD после аутентификации пользователя в OpenId Connect. Это веб-приложение, интегрированное с AAD OpenId Connect.Мне нужно получить токен доступа для вызова другого API, который использует тот же AAD. Вот что я пробовал:

  1. Клон этот пример кода.
  2. В файле Startup.cs добавьте следующий блок кода:

     public void ConfigureServices(IServiceCollection services) {
        services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor();
    
        services.AddAuthentication(sharedOptions =>
    {
        sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
    })
    .AddAzureAd(options => Configuration.Bind("AzureAd", options))
          .AddOpenIdConnect("oidc", options =>
          {
              options.Authority = "http://localhost:5000";
              options.ClientId = "<<client-id>>";
              options.SignInScheme = "cookie";
              options.SaveTokens = true;
              options.GetClaimsFromUserInfoEndpoint = true;
              options.RequireHttpsMetadata = false;
    
          })
    .AddCookie();
    services.AddMvc();}
    
  3. В классе HomeController я добавил приватную переменную с именем httpContextAccessor, а также установите его в конструкторе.

        private IHttpContextAccessor _httpContextAccessor;
        public HomeController(IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
        }
    
  4. В классе HomeController я добавил некоторый код для доступа к токену доступа.

     public IActionResult Index()
        {
            if (User.Identity.IsAuthenticated)
            {
                var attempt1 = Request.Headers["Authorization"];
                var attempt2 = HttpContext.GetTokenAsync("access_token");
                var attempt3 = _httpContextAccessor.HttpContext.GetTokenAsync("access_token");
                var attempt4 = _httpContextAccessor.HttpContext.Request.Headers["Authorziation"];
            }
            return View();
        }
    

Но все они возвращают либо пустое, либо нулевое значение.Я что-то пропустил?

Я посмотрел следующие записи для справки: Как обновить токен доступа Как получить токен доступа из HttpContext в .Net core 2.0

1 Ответ

0 голосов
/ 21 февраля 2019

Вам нужно установить SaveTokens в true в конфигурации OpenID Connect:

  1. Клонировать этот пример кода
  2. Сохранить Startup.cs, вам не нужноЧтобы добавить .AddOpenIdConnect часть, метод расширения AddAzureAd поможет добавить проверку подлинности Azure Active Directory к вашему приложению.

  3. Измените папку AzureAdAuthenticationBuilderExtensions.cs в Extensions:

    public void Configure(string name, OpenIdConnectOptions options)
    {
        options.ClientId = _azureOptions.ClientId;
        options.Authority = $"{_azureOptions.Instance}{_azureOptions.TenantId}";
        options.UseTokenLifetime = true;
        options.CallbackPath = _azureOptions.CallbackPath;
        options.RequireHttpsMetadata = false;
        options.SaveTokens = true;  // set to true 
    }
    
  4. Тогда вы можете получить идентификатор токена от httpContextAccessor:

    var idToken = _httpContextAccessor.HttpContext.GetTokenAsync("id_token");
    

Но токен доступа по-прежнему равен нулю.В этом примере показано, как использовать промежуточное программное обеспечение OpenID Connect ASP.NET Core для входа пользователей из одного клиента Azure AD. Это означает, что вы можете получить ID Token, который отправляется клиентскому приложению как часть потока OpenID Connect, ииспользуется клиентом для аутентификации пользователя.Пожалуйста, обратитесь к документу: ID токены .

В то время как Access tokens позволяют клиентам безопасно вызывать API, защищенные Azure.См. Документ: токены доступа Azure Active Directory .

Если вы хотите получить токен доступа для доступа к ресурсу, защищенному Azure AD, вам следует использовать ADAL (Конечная точка Azure AD V1.0) для получения токена, см. Пример кода (особенно используйте OnAuthorizationCodeReceived для получения токена доступа ):

https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect-aspnetcore

илииспользуйте MSAL , если вы используете конечную точку Azure AD V2.0.

...