【问题标题】:How to get JWTToken from ASPNET Core Controller?如何从 ASP NET Core 控制器获取 JWT 令牌?
【发布时间】:2018-01-18 22:16:51
【问题描述】:

我正在尝试向受保护的 API 发出请求,因此我需要向 HttpClient 添加授权请求标头,如下所示:

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "Your Oauth token");

但是如何从控制器获取身份验证令牌(“您的 Oauth 令牌”)?

PS:我已经通过 Identity Server 4 的身份验证。 在 AspNetCore 中开发的应用程序。

完整代码:

    [Authorize] //Already authenticated
    public IActionResult SomeControllerAction()
    {
        var claimsIdentity = User.Identity as ClaimsIdentity; //where is JWTToken??
        var JWTTokne = "how to get?";

        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", JWTTokne);
            var result = client.PostAsync("someurl", new StringContent(json, Encoding.UTF8, "application/json")).Result;
            //more code to handle result....
        }

        return View();
    }

【问题讨论】:

  • 控制器动作是[授权]动作吗? IOW 是使用在请求中发送了 Authorization 标头的客户端调用的控制器吗?
  • 是的,它已被授权一个已经过身份验证的操作。

标签: c# asp.net-core identityserver4 asp.net-core-identity


【解决方案1】:

您可以查看 HTTP 上下文,因为您在控制器中,您可以从 HttpContext.Request.Headers["Authorization"] 的标头中获取令牌。这显然只有在客户端将该标头放入请求时才有效。

【讨论】:

  • 好吧,我的情况不是这样。身份验证系统按预期工作,但我无法显式获取身份验证令牌。
【解决方案2】:

您可以通过以下方式获取访问令牌:

// Get the access token.
var accessToken = await HttpContext.Authentication.GetTokenAsync("access_token");

var client = new HttpClient();

// Set the access token as the bearer token (Authorization header of the request).

client.SetBearerToken(accessToken);

【讨论】:

  • GetTokenAsync 方法在底层做了什么?为什么不使用 Request.Headers["Authorization"]?
【解决方案3】:

核心:

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

或者这个:

var token = Request.Headers["Authorization"];

对于我使用的 MVC 5 控制器中的 access_token:

var token = (User as ClaimsPrincipal).FindFirst("access_token").Value

在我使用的受保护的 web api 2(非核心)方法中:

var access_token = ControllerContext.Request.Headers.Authorization.Parameter;

【讨论】:

  • Request.Headers["Authorization"] 肯定对我不起作用,它只是返回 null。第一种方法有效,但是我真的很想找出为什么另一种方法不起作用。你有什么猜测吗? (我用的是Oidc,一切正常,我只想明确到达Auth标头)
  • .Net Core 3.1 我得到了不记名令牌。希望能帮助到你。 HttpContext.Request.Headers.TryGetValue("授权", out var tokenHeaders);
  • 在 ConfigureServices 我有 builder.AddIdentityServerAuthentication("Bearer", (JwtBearerOptions options) => {options.Authority = "blabla"; options.Audience = "api1"; }, (options) => { options.TokenRetriever = new Func(req => { var fromHeader = TokenRetrieval.FromAuthorizationHeader(); var fromQuery = TokenRetrieval.FromQueryString(); var token = fromHeader(req) ?? fromQuery(req); return令牌;});});不知道有没有影响。问候。
【解决方案4】:

使用 AspNet Core 2.0 和新的身份验证系统,您只需使用 HttpContext 之上的扩展方法。

HttpContext context;
await context.GetTokenAsync("access_token")

在 MVC 控制器中

public class MyController : Controller
{
    public IActionResult Get(){
         var token = await HttpContext.GetTokenAsync("access_token");

    }

}

【讨论】:

    猜你喜欢
    • 2020-01-17
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2018-03-02
    • 2019-01-21
    • 2016-06-16
    • 2019-02-22
    • 2020-11-20
    相关资源
    最近更新 更多