У меня есть 2 проекта, один для API, а второй - для просмотра и получения данных с помощью API-интерфейсов 1-го проекта. Для обоих я реализовал аутентификацию Azure AD, но моя проблема заключается в том, что я пытаюсь вызвать API из второй серверной части проекта (C #) с токеном носителя, но в ответ я получаю ошибку ниже.
Примечание: я использую фильтр [Authorize] в каждом классе и методе в обоих проектах.
Ошибка
AuthenticationFailed: IDX10501: Ошибка проверки подписи. Невозможно сопоставить 'kid': 'SSQdhI1cKvhQEDSJxE2gGYs40Q0', токен: '{"alg": "RS256", "typ": "JWT", "kid": "SSQdhI1cKvhQEDSJxE2gGYs40Q0 "-d:" 1e "ad6" aud "}. {" Aud " 4e65-98de-c6f5db1ae08a "," iss ":" https://login.microsoftonline.com/5c58f0d9-2f98-4eb0-91f2-ec6afd4242f8/v2.0 "," iat ": 1518520450," nbf ": 1518520450," exp ": 1518524350," aio ":" Y2NgYHiknfZAIvPElucJpgeZzRa5AAA = "," azp ":" 1e615ddb-ad4d-4e65-98de-c6f5db1ae08a "," azpacr ":" 1 "," e_exp ": 262800-4bfc9b0," oid977 ": 262800-4bfc5-90," oid9 ": "sub": "159f0ec6-c5b9-4bfc-88d0-77924bd40b3f", "tid": "5c58f0d9-2f98-4eb0-91f2-ec6afd4242f8", "uti": "t8CU6YtsHE-5MaAAbQm", 2.0 '.
Запустить класс ConfigureServices Method
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddAzureAdB2C(options => Configuration.Bind("Authentication:AzureAdB2C", options))
.AddCookie();
// Add framework services.
services.AddMvc();
// Adds a default in-memory implementation of IDistributedCache.
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromHours(1);
options.CookieHttpOnly = true;
});
}
Стартовый класс Настроить метод
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseSession();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
Класс для получения жетона на предъявителя
public class ServicePrincipal
{
static string authority = "https://login.microsoftonline.com/{TenantID}/{Policy}/v2.0/";
static string clientId = "XXX";
static string clientSecret = "XXX";
static string resource = "XXX";
static public async Task<Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationResult> GetS2SAccessTokenForProdMSAAsync()
{
return await GetS2SAccessToken(authority, resource, clientId, clientSecret);
}
static async Task<Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationResult> GetS2SAccessToken(string authority, string resource, string clientId, string clientSecret)
{
var clientCredential = new Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential(clientId, clientSecret);
AuthenticationContext context = new AuthenticationContext(authority, false);
Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationResult authenticationResult = await context.AcquireTokenAsync(resource,clientCredential);
return authenticationResult;
}
}
Метод контроллера, откуда я пытаюсь вызвать API 1-го проекта
public async Task<IActionResult> GetCustomerGroupAsync()
{
try
{
var token = await ServicePrincipal.GetS2SAccessTokenForProdMSAAsync();
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.AccessToken);
HttpResponseMessage response = await _client.GetAsync("http://localhost:49942/api/customermodule/v0.3/customergroup");
response.EnsureSuccessStatusCode();
string receiveStream = await response.Content.ReadAsStringAsync();
return null;
}
catch (Exception e)
{
return Json(new { Error = e.Message });
}
}
Пожалуйста, дайте мне знать, если я что-то упускаю или делаю что-то не так? Спасибо.