Ошибка авторизации в Azure AD при аутентификации: IDX10501: проверка подписи не прошла. Невозможно сопоставить "ребенок"

У меня есть 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 });
        }
    }

Пожалуйста, дайте мне знать, если я что-то упускаю или делаю что-то не так? Спасибо.


person Darshan Dave    schedule 13.02.2018    source источник


Ответы (2)


В зависимости от вашего GetCustomerGroupAsync действия вы используете поток учетных данных клиента в серверной части веб-сайта для доступа к защищенному ресурсу (веб-API) с помощью Azure AD B2C. Как Azure Active Directory B2C: Типы приложений упоминаются в разделе «Текущие ограничения» следующим образом:

Демоны / серверные приложения

Приложениям, которые содержат длительные процессы или которые работают без присутствия пользователя, также необходим способ доступа к защищенным ресурсам, таким как веб-API. Эти приложения могут проходить проверку подлинности и получать токены, используя удостоверение приложения (а не делегированное удостоверение пользователя) и поток учетных данных клиента OAuth 2.0.

Этот поток в настоящее время не поддерживается в Azure AD B2C. Эти приложения могут получать токены только после интерактивного взаимодействия с пользователем.

Более того, вы можете следовать примерам git ниже, чтобы реализовать свое требование:

веб-API ASP.NET Core 2.0 с Azure AD B2C

Веб-приложение ASP.NET Core с Azure AD B2C

person Bruce Chen    schedule 14.02.2018
comment
Я понял, это идеальный образец проекта без ошибок. github.com / dzimchuk / azure-ad-b2c-asp-net-core - person Darshan Dave; 26.02.2018