Консольное приложение 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 или проблема существует в моем коде.
Обращение за помощью.