0

这是我的 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 是 Bearer

这些是我的选择:

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...

更新: 看到评论/答案后,我添加了等待,但结果为 null。

4

1 回答 1

0

该方法GetTokenAsync("access_token")是异步的并且正在返回一个System.Threading.Tasks.Task<string>结果。所以var这里翻译为:

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

为了访问实际结果,您需要从任务中解压它。最简单的方法是使用await关键字:

string token = await _httpContextAccessor.HttpContext.GetTokenAsync("access_token");
于 2018-03-30T15:51:59.083 回答