用户在 OpenId Connect (AAD) 之后通过身份验证但无法找到访问令牌
User is authenticated after OpenId Connect (AAD) but Unable to find access token
在用户通过 OpenId Connect 进行身份验证后,我正在尝试从 AAD 中查找访问令牌。 它是一个与 AAD OpenId Connect 集成的 Web 应用程序。我需要获取访问令牌才能调用另一个使用相同 AAD 的 API。 这是我尝试过的方法:
- 克隆 this 示例代码。
在 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();}
在HomeController
class中,我添加了一个名为httpContextAccessor
的私有变量,并在构造函数中设置了它。
private IHttpContextAccessor _httpContextAccessor;
public HomeController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
在HomeController
class中,我添加了一些代码来访问访问令牌。
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();
}
但所有这些 return 要么为空,要么为空。我错过了什么吗?
我查看了以下帖子以供参考:
How to refresh access token
您需要在 OpenID Connect 配置中将 SaveTokens
设置为 true:
- 克隆该代码示例
保留 Startup.cs
,您不需要添加 .AddOpenIdConnect
部分, AddAzureAd
扩展方法将有助于将 Azure Active Directory 身份验证添加到您的应用程序。
修改Extensions
文件夹中的AzureAdAuthenticationBuilderExtensions.cs
:
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
}
然后可以从httpContextAccessor
获取ID token:
var idToken = _httpContextAccessor.HttpContext.GetTokenAsync("id_token");
但是访问令牌仍然是 null 。该示例展示了如何使用 OpenID Connect ASP.NET 核心中间件从单个 Azure AD 租户登录用户,这意味着您可以获得 ID Token
作为OpenID Connect 流,并由客户端用于对用户进行身份验证。请参考文档:ID tokens .
虽然 Access tokens
使客户端能够安全地调用受 Azure 保护的 API。请参考文档:Azure Active Directory access tokens .
如果你想获取访问受 Azure AD 保护的资源的访问令牌,你应该使用 ADAL(Azure AD V1.0 endpoint) to obtain the token , see code sample(especially use OnAuthorizationCodeReceived
to acquire access token):
https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect-aspnetcore
如果您使用的是 Azure AD V2.0 终结点,则使用 MSAL。
在用户通过 OpenId Connect 进行身份验证后,我正在尝试从 AAD 中查找访问令牌。 它是一个与 AAD OpenId Connect 集成的 Web 应用程序。我需要获取访问令牌才能调用另一个使用相同 AAD 的 API。 这是我尝试过的方法:
- 克隆 this 示例代码。
在 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();}
在
HomeController
class中,我添加了一个名为httpContextAccessor
的私有变量,并在构造函数中设置了它。private IHttpContextAccessor _httpContextAccessor; public HomeController(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; }
在
HomeController
class中,我添加了一些代码来访问访问令牌。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(); }
但所有这些 return 要么为空,要么为空。我错过了什么吗?
我查看了以下帖子以供参考:
How to refresh access token
您需要在 OpenID Connect 配置中将 SaveTokens
设置为 true:
- 克隆该代码示例
保留
Startup.cs
,您不需要添加.AddOpenIdConnect
部分,AddAzureAd
扩展方法将有助于将 Azure Active Directory 身份验证添加到您的应用程序。修改
Extensions
文件夹中的AzureAdAuthenticationBuilderExtensions.cs
: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 }
然后可以从
httpContextAccessor
获取ID token:var idToken = _httpContextAccessor.HttpContext.GetTokenAsync("id_token");
但是访问令牌仍然是 null 。该示例展示了如何使用 OpenID Connect ASP.NET 核心中间件从单个 Azure AD 租户登录用户,这意味着您可以获得 ID Token
作为OpenID Connect 流,并由客户端用于对用户进行身份验证。请参考文档:ID tokens .
虽然 Access tokens
使客户端能够安全地调用受 Azure 保护的 API。请参考文档:Azure Active Directory access tokens .
如果你想获取访问受 Azure AD 保护的资源的访问令牌,你应该使用 ADAL(Azure AD V1.0 endpoint) to obtain the token , see code sample(especially use OnAuthorizationCodeReceived
to acquire access token):
https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect-aspnetcore
如果您使用的是 Azure AD V2.0 终结点,则使用 MSAL。