从OpenId Connect对用户进行身份验证后,我正在尝试从AAD查找访问令牌。 这是与AAD OpenId Connect集成的Web应用程序。我需要获取访问令牌才能调用另一个使用相同AAD的API。这是我尝试过的操作:
在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
类中,我添加了一个名为httpContextAccessor
的私有变量,并将其设置在构造函数中。
private IHttpContextAccessor _httpContextAccessor;
public HomeController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
在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
答案 0 :(得分:1)
您需要在OpenID Connect配置中将SaveTokens
设置为true:
保留Startup.cs
,您无需添加.AddOpenIdConnect
部分,AddAzureAd
扩展方法将有助于向您的应用程序添加Azure Active Directory身份验证。
修改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
}
然后您可以从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。