【发布时间】:2018-09-20 23:12:35
【问题描述】:
我正在尝试将一个项目从 .Net core 1.1 升级到 .Net core 2.0,其中有很多重大变化。
我目前遇到的一个问题是HttpContext.Authentication 现在已过时。
我一直试图弄清楚如何获取当前请求的访问令牌。我需要调用另一个需要不记名令牌的 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();
}
无法解析类型“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?}");
});
【问题讨论】:
-
您不必注册
HttpContext。它已经在您的控制器类中可用,就像在 1.1 中一样。 -
@Brad 这就是我的想法,但我无法访问它,请描述你的意思。
-
你的控制器是否继承自
Controller类? -
如果
GetAccessToken()返回 null 可能是您的身份验证配置存在问题。您是如何在 Startup 中配置身份验证的? -
ClientUpdate 在同一个 ConsoleController 中,所以我不得不说是?
标签: c# http asp.net-core .net-core