从.Net Core 2.0控制器(承载)获取Azure令牌

时间:2018-03-30 14:11:35

标签: c# asp.net-core asp.net-core-2.0 azure-authentication

这是我的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");

这就是它的回报:

Click for the image

我需要的是access_token。恩。持票人eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1 ...

更新 在我看到评论/答案之后,我添加了等待,但结果我得到了空。

1 个答案:

答案 0 :(得分: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");