在控制器中检索访问令牌

Retrieving access token in controller

我正在开发一个 ASP .Net Core 1.1 MVC 网络应用程序,它使用 "Authorization Code Grant Flow" 调用网络 API。我正在使用 Auth0 作为身份验证服务器。

按照 Auth0 教程,此时用户已成功登录网络应用程序,现在执行一些操作使网络应用程序调用网络 api,它说我应该获得访问权限代币如下:

public async Task<IActionResult> Index()
{
    string accessToken = User.Claims.FirstOrDefault("access_token")?.Value;

    if (accessToken == "")
        return View("Error");

    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

    HttpResponseMessage responseMessage = await client.GetAsync(inspectionsUrl);
    if (responseMessage.IsSuccessStatusCode)
    {
        var responseData = responseMessage.Content.ReadAsStringAsync().Result;
        List<Inspection> inspections = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Inspection>>(responseData);
        return View(inspections);
    }
    return View("Error");
}

然而,这甚至没有编译,给出以下

Argument 2: cannot convert from 'string' to 'System.Func <System.Security.Claims.Claim, bool>'

有什么想法吗?

第一行大概应该是:

string accessToken = User.Claims.FirstOrDefault(c => c.Type == "access_token")?.Value;

现在您正试图将 "access_token" 作为 FirstOrDefault 的参数,这是行不通的。您必须指定谓词。

您可以编写扩展并使用更优雅的方式来检索访问令牌:

var accessToken = await HttpContext.Authentication.GetTokenAsync("access_token");