プロジェクトを.Netコア1.1から.Netコア2.0にアップグレードしようとしていますが、多くの重大な変更があります。現在私が問題を抱えていることの1つは、HttpContext.Authentication
が廃止されたことです。
現在のリクエストのアクセストークンを取得する方法を理解しようとしています。ベアラートークンを必要とする別のAPIを呼び出す必要があります。
Old Method .Net core 1.1
[Authorize]
public async Task<IActionResult> ClientUpdate(ClientModel client)
{
var accessToken = await HttpContext.Authentication.GetTokenAsync("access_token");
return View();
}
Method .Net core 2.
コンテキストが登録されていないため、これは機能しません。
[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 ConfigureServices
ここにも多くの重大な変更があったので、それがスタートアップに何かあったとしても、私は驚かないでしょう。
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 Configure
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?}");
});
最終的には構成の問題になりました。 Cookieをヘッダーに読み込むためには、AddAuthenticationとAddOpenIdConnectの間にリンクが必要です。
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
options.Authority = "http://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();
}
アクセストークンが読み込まれます。
注:私はこのプロジェクトからそれを掘り起こしました Startup.cs
。Net core 2.1 JWTベアラートークンにアクセスする
var accessToken = Request.Headers["Authorization"];
アズハルディンの答えからの小さな変化
次のようなStartupメソッドでサービスインスタンスを登録します
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
...
}
そして、次のようにコントローラに依存関係を注入します
private IHttpContextAccessor _httpContextAccessor;
public ClientController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
そして次のようなアクションでアクセストークンを取得します
[Authorize]
public async Task<IActionResult> ClientUpdate(ClientModel client)
{
var accessToken = _httpContextAccessor.HttpContext.Request.Headers["Authorization"];
..........//Some other code
return View();
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
...
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
...
}
Controller.csコンストラクター
private IHttpContextAccessor _httpContextAccessor;
public ClientController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
[Authorize]
public async Task<IActionResult> ClientUpdate(ClientModel client)
{
var accessToken = await _httpContextAccessor.HttpContext.GetTokenAsync("access_token");
return View();
}
これは動作するはずです
本当にありがとう、これは完璧です!
この作業はありましたが、Azureテナント専用の権限を使用しました。 ******をテナント名に置き換えるだけです。
options.Authority = "https://login.microsoftonline.com/******.onmicrosoft.com";
テナントIDを使用することもできます。 https://login.microsoftonline.com/ の後にテナントIDを挿入するだけです
options.Authority = "https://login.microsoftonline.com/be0be093-****-****-****-5626e83beefc";