在OpenId Connect(AAD)之后对用户进行身份验证,但无法找到访问令牌

时间:2019-02-20 20:40:05

标签: authentication asp.net-core azure-active-directory access-token openid-connect

从OpenId Connect对用户进行身份验证后,我正在尝试从AAD查找访问令牌。 这是与AAD OpenId Connect集成的Web应用程序。我需要获取访问令牌才能调用另一个使用相同AAD的API。这是我尝试过的操作:

  1. 克隆this示例代码。
  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();
        }
    

但是它们全部返回空或空值。我有想念吗?

我查看了以下帖子以供参考: How to refresh access token How to get access token from HttpContext in .Net core 2.0

1 个答案:

答案 0 :(得分:1)

您需要在OpenID Connect配置中将SaveTokens设置为true:

  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获取ID令牌:

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

但是访问令牌仍然为null。该示例演示如何使用OpenID Connect ASP.NET Core中间件从单个Azure AD租户登录用户,这意味着您可以获得ID Token,该信息将作为OpenID Connect的一部分发送到客户端应用程序流程,客户端使用它来验证用户身份。请参阅文档:ID tokens

Access tokens使客户端可以安全地调用Azure保护的API。请参阅文档:Azure Active Directory access tokens

如果要获取用于访问受Azure AD保护的资源的访问令牌,则应使用ADAL(Azure AD V1.0端点)来获取令牌,请参见代码示例(尤其是{{3} }):

use OnAuthorizationCodeReceived to acquire access token

或者如果使用的是Azure AD V2.0终结点,请使用https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect-aspnetcore