c# - 如何从 .Net core 2.0 中的 HttpContext 获取访问 token

标签 c# http asp.net-core .net-core

我正在尝试将项目从 .Net core 1.1 升级到 .Net core 2.0,其中有很多重大更改。

我目前遇到的问题之一是 HttpContext.Authentication 现在已过时。

我一直在努力弄清楚如何获取当前请求的访问 token 。我需要调用另一个需要不记名 token 的 API。

旧方法 .Net core 1.1

[Authorize]
public async Task<IActionResult> ClientUpdate(ClientModel client)
{
    var accessToken = await HttpContext.Authentication.GetTokenAsync("access_token");
    return View();
}

方法.Net core 2.0

这不起作用,因为上下文未注册。

[Authorize]
public async Task<IActionResult> ClientUpdate(ClientModel client)
{
    var accessToken = await context.HttpContext.GetTokenAsync("access_token"); 
    return View();
}

Unable to resolve service for type 'Microsoft.AspNetCore.Http.HttpContext'

我试过注册,但还是不行

public ConsoleController(IOptions<ServiceSettings> serviceSettings, HttpContext context) 

在 startup.cs 中

services.TryAddSingleton<HttpContext, HttpContext>();

更新:

这会返回 null

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

Startup.cs 配置服务

如果这是初创公司的事情,我不会感到惊讶,因为这里也有很多重大变化。

services.Configure<ServiceSettings>(Configuration.GetSection("ServiceSettings"));
//services.TryAddSingleton<HttpContext, HttpContext>();
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddMvc();
services.AddAuthentication(options =>
        {
            options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
        })
        .AddCookie()
        .AddOpenIdConnect(options =>
        {
            options.Authority = "http://localhost:5000";
            options.ClientId = "testclient";
            options.ClientSecret = "secret";
            options.ResponseType = "code id_token";
            options.RequireHttpsMetadata = false;
            options.GetClaimsFromUserInfoEndpoint = true;
        });

Startup.cs 配置

loggerFactory.AddDebug();
if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
    app.UseBrowserLink();
}
else
{
    app.UseExceptionHandler("/Home/Error");
}
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

最佳答案

.Net核心2.1 访问 JWT 不记名 token

var accessToken = Request.Headers[HeaderNames.Authorization];

关于c# - 如何从 .Net core 2.0 中的 HttpContext 获取访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49768774/

相关文章:

asp.net-core - 如何在 ASP.NET Core(.NET Framework 目标)项目中引用旧程序集?

C# 验证多个文本框?

c# - 为什么默认 webapi .Net Core 应用程序中没有任何内容传递给 .UseStartup<Startup>() 方法?

java - Java 中 HttpGet/Post 的包装类?

javascript - Node.js 作为转发代理但更改 URL 路径?

c# - 如何在asp.net core razor页面中拒绝匿名用户?

c# - 为什么 GetHashCode 在 Object 类中?

c# - 任务处理的差异

javascript - 使用一个 http 请求下载文件,无需压缩

c# - 为 API 请求禁用 StatusCodePages 中间件