Консольное приложение C# не может получить доступ к веб-API с помощью AccessToken, всегда выдает ошибку 401

Я новичок в Azure. Я зарегистрировал приложение в Azure B2C. И я пытаюсь получить доступ к своему веб-API из консольного приложения С # (не ядра DOT NET).

Я могу сгенерировать AccessToken, используя приведенный ниже код, и успешно получить доступ к моему API с localhost. Но если я добавлю атрибут [Authorize] в свое действие веб-API, я получаю 401, т.е. неавторизованную ошибку.

Пожалуйста, посмотрите мой код ниже.

            string clientId = "{client Id of the application that I have registered using azure app registration in Azure B2C}";
            string clientSecret = "{client secret of the application that I have registered using azure app registration in Azure B2C}";
            string instance = "https://login.microsoftonline.com/{0}/";
            string tenantId = "{Tenant Id that I can see when I open the application that I have registered using azure app registration in Azure B2C}";           

            IConfidentialClientApplication app;

            app = ConfidentialClientApplicationBuilder.Create(clientId)
                    .WithClientSecret(clientSecret)
                    .WithAuthority(AzureCloudInstance.AzurePublic, tenantId)
                    .Build();

            string[] scopes = new string[] { "https://graph.microsoft.com/.default" };
            AuthenticationResult result = null;
            result = await app.AcquireTokenForClient(scopes)
                   .ExecuteAsync();

            if (result != null)
            {
                var httpClient = new HttpClient();
                var apiCaller = new ProtectedApiCallHelper(httpClient);

                string webApiUrl = "http://localhost:51615/Sample/apis/Sample/Customers/Search";

                var defaultRequetHeaders = httpClient.DefaultRequestHeaders;
                if (defaultRequetHeaders.Accept == null || !defaultRequetHeaders.Accept.Any(m => m.MediaType == "application/json"))
                {
                    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                }
                defaultRequetHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);

                HttpResponseMessage response = await httpClient.GetAsync(webApiUrl);
                if (response.IsSuccessStatusCode)
                {
                    string json = await response.Content.ReadAsStringAsync();
                    var jsonResult = JsonConvert.DeserializeObject<List<JObject>>(json);
                }
                else
                {
                    Console.WriteLine($"Failed to call the Web Api: {response.StatusCode}");
                    string content = await response.Content.ReadAsStringAsync();
                }
                Console.ResetColor();
            }

Ниже мой код контроллера WebApi.

namespace PccNet.Web.Sample.Api.Controllers
{
    [RoutePrefix("apis/Sample/Customers")]
    public class SampleCustomersApiController : ApiController
    {
        [HttpGet]
        [Route("Search")] 
        public IHttpActionResult Search()
        {
            var customers = ReadCustomers();
            return Json(customers);
        }        
    }
}

Но если я добавлю [Авторизовать] в действие поиска (см. Ниже), я получаю ошибку 401 (сообщение об ошибке ниже).

namespace PccNet.Web.Sample.Api.Controllers
{
    [RoutePrefix("apis/Sample/Customers")]
    public class SampleCustomersApiController : ApiController
    {
        [Authorize]
        [HttpGet]
        [Route("Search")] 
        public IHttpActionResult Search()
        {
            var customers = ReadCustomers();
            return Json(customers);
        }        
    }
}

Сообщение об ошибке:{StatusCode: 401, ReasonPhrase: 'Unauthorized', версия: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers

Я не уверен, что я что-то пропустил при регистрации своего приложения в Azure B2C, или отсутствует какая-то конфигурация Azure B2C или проблема существует в моем коде.

Обращение за помощью.

0 ответов

Другие вопросы по тегам