【问题标题】:Retrieving access token in controller在控制器中检索访问令牌
【发布时间】:2017-10-29 14:53:36
【问题描述】:

我正在开发一个 ASP .Net Core 1.1 MVC Web 应用程序,它使用“授权代码授予流程”调用 Web API。我正在使用 Auth0 作为身份验证服务器。

按照 Auth0 教程,当用户成功登录到 Web 应用程序时,现在做了一些使 Web 应用程序调用 Web 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>'

有什么想法吗?

【问题讨论】:

    标签: authorization asp.net-core-mvc access-token auth0


    【解决方案1】:

    第一行应该是:

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

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

    【讨论】:

    • 谢谢你!那成功了!不幸的是,返回的“accessToken”是空的,但这是我想弄清楚的——至少它现在可以编译了! :)
    【解决方案2】:

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

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

    【讨论】:

    • 将实现添加到答案中怎么样?
    猜你喜欢
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2015-09-08
    • 2020-10-12
    • 2013-06-21
    • 2021-06-08
    相关资源
    最近更新 更多