По сути, вам необходимо защитить оба ваших API с помощью Identity Server.Что-то вроде:
API 1 Startup.cs :
services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(options =>
{
options.Authority = "https://localhost:5000";
options.SupportedTokens = SupportedTokens.Both;
options.RequireHttpsMetadata = false;
options.ApiName = "api1";
});
То же самое для API 2, но options.ApiName
должно быть другим.Затем вашему клиенту javascript при создании на стороне Identity Server должен быть разрешен доступ к этим 2 API-интерфейсам (разрешенные области действия):
new Client
{
ClientId = "your.js.client.id",
AllowedGrantTypes = GrantTypes.Implicit,
AllowAccessTokensViaBrowser = true,
RedirectUris = { "http://localhost:5003/callback.html" },
PostLogoutRedirectUris = { "http://localhost:5003/index.html" },
AllowedCorsOrigins = { "http://localhost:5003" },
AllowedScopes =
{
"api2",
"api1"
}
}
Этот код взят из официальной документации .
А затем в API 2, когда вы хотите вызвать контроллер API 1, вам нужно что-то вроде:
var client = new HttpClient();
client.SetBearerToken(accessToken);
client.GetStringAsync("https://localhost/api1/test");
Где вы получите access_token
:
[Authorize]
public async Task<IActionResult> ControllerMethodInApi2()
{
var accessToken = await context.HttpContext.GetTokenAsync("access_token");
return View();
}
Это должно сработать для вас.