我正在尝试将项目从.Net core 1.1升级到.Net core 2.0,其中有很多重大更改。我当前遇到的问题之一是 HttpContext.Authentication 现在已过时。
I am trying to upgrade a project from .Net core 1.1 to .Net core 2.0 there are a lot of breaking changes. One of the things i am currently having an issue with is that HttpContext.Authentication is now obsolete.
我一直试图弄清楚如何为当前请求获取访问令牌。我需要调用另一个需要承载令牌的API。
I have been trying to figure out how to get the Access token for the current request. I need to make a call to another API which requires a bearer token.
旧方法.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
此操作无效,因为上下文未注册。
This is not working becouse context isnt registered.
[Authorize] public async Task<IActionResult> ClientUpdate(ClientModel client) { var accessToken = await context.HttpContext.GetTokenAsync("access_token"); return View(); }
无法解析 Microsoft类型的服务。 AspNetCore.Http.HttpContext'
Unable to resolve service for type 'Microsoft.AspNetCore.Http.HttpContext'
我尝试注册它,但这也不起作用
I tried registering it but that doesnt work either
public ConsoleController(IOptions<ServiceSettings> serviceSettings, HttpContext context)在startup.cs
In startup.cs
services.TryAddSingleton<HttpContext, HttpContext>();更新:
这将返回null
var accessToken = await HttpContext.GetTokenAsync("access_token");Startup.cs ConfigureServices
如果它对初创公司有所帮助,我也不会感到惊讶,因为这里也有很多重大更改。
I wouldn't be surprised if it was something in the startup as there were a lot of breaking changes here as well.
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 = "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?}"); });推荐答案
这最终是一个配置问题。
It ended up being a configuration issue. There needs to be a link between AddAuthentication and AddOpenIdConnect in order for it to read the cookie into the headers.
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>(); services.AddAuthentication(options => { options.DefaultScheme = "Cookies"; options.DefaultChallengeScheme = "oidc"; }) .AddCookie("Cookies") .AddOpenIdConnect("oidc", options => { options.SignInScheme = "Cookies"; options.Authority = "localhost:5000"; options.RequireHttpsMetadata = false; options.ClientId = "testclient"; options.ClientSecret = "secret"; options.ResponseType = "code id_token"; options.SaveTokens = true; options.GetClaimsFromUserInfoEndpoint = true; options.Scope.Add("testapi"); options.Scope.Add("offline_access"); });控制器
[Authorize] public async Task<IActionResult> Index() { var accessToken = await HttpContext.GetTokenAsync("access_token"); return View(); }现在已填充访问令牌。
Access token is now populated.
注意:我最终从项目 Startup.cs
更多推荐
如何从.Net Core 2.0中的HttpContext获取访问令牌
发布评论