Как получить токен для безопасного веб-API с помощью IConfidentialClientApplicationC#

Место общения программистов C#
Ответить
Anonymous
 Как получить токен для безопасного веб-API с помощью IConfidentialClientApplication

Сообщение Anonymous »

Я получаю ошибку недопустимого токена при попытке получить его из консольного приложения C#. Позвольте мне объяснить.
Сценарий 1 (из внешнего приложения):
  • Пользователь вводит свои учетные данные в приложение React.
  • Вызов осуществляется на https://login.microsoftonline.com/{tena ... /authorize endpoint.< /li>
    Идентификатор токена извлекается (пока все хорошо)
  • Когда аутентифицированный пользователь отправляет запрос к любой конечной точке частного веб-API, Вызов следующей конечной точки: https://login.microsoftonline.com/{tena ... v2.0/token выполняется с прикреплением идентификатора токена из шага 3.
  • Новый Токен JWT получен.
  • Этот токен JWT прикрепляется к заголовкам запроса, сделанного к веб-API.
  • Ответ возвращается в приложение React. .
Это обычный процесс, который мы используем при взаимодействии между приложением React и веб-API. Вот визуальный поток из документов MS
А теперь новый сценарий:
Сценарий 2 (попробуйте сделать или смоделировать то же самое из консольного приложения C#):
Я пытаюсь прикрепить токен JWT к заголовок из кода C#, для этого я использую MSAL.NET. Я следую официальному документу.
Для тестирования я использую консольное приложение:

Код: Выделить всё

private static async Task RunAsync()
{
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";
string webAppUri = "web app domain";

// For Web applications that use OpenID Connect Authorization Code flow, use IConfidentialClientApplication
IConfidentialClientApplication app;

app = ConfidentialClientApplicationBuilder
.Create(clientId)
.WithClientSecret(clientSecret)
.WithAuthority(new Uri($"https://login.microsoftonline.com/{tenantId}"))
.WithLegacyCacheCompatibility(false)
.Build();

// For confidential clients, this value should use a format similar to {Application ID URI}/.default.
// https://learn.microsoft.com/en-us/azure/active-directory/develop/quickstart-v2-netcore-daemon#requesting-tokens
string[] scopes = new string[] { $"{webAppUri}/.default" };

AuthenticationResult result = null;

try
{
result = await app.AcquireTokenForClient(scopes).ExecuteAsync();
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Token acquired");
Console.WriteLine($"{result.AccessToken}");

Console.ResetColor();
}
catch (MsalServiceException ex) when (ex.Message.Contains("AADSTS70011"))
{
// Invalid scope.  The scope has to be of the form "https://resourceurl/.default"
// Mitigation: change the scope to be as expected
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Scope provided is not supported");
Console.ResetColor();
}

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

string webApiUrl = "http://localhost:12345/mycustomwebapi/list";

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[*]>(json);
}
else
{
Console.WriteLine($"Failed to call the Web Api: {response.StatusCode}");
string content = await response.Content.ReadAsStringAsync();
}
Console.ResetColor();
}
}
Проблема, с которой я столкнулся в приведенном выше коде, заключается в том, что я получаю хорошо отформатированный токен JWT и прикрепляю его к заголовкам. Но при вызове пользовательского/защищенного веб-API я получаю 401 несанкционированный ответ.
Итак, у меня разные мысли по этому поводу:< /p>
  • Я не совсем уверен, пропустил ли я шаг в этом коде C# по сравнению с шагами в сценарии 1.
  • Или мне нужно настроить какой-либо специальный доступ/разрешения в Azure для веб-API, который уже зарегистрирован в Azure AD.
  • Следует ли мне попытаться выполнить те же действия на C#?
Еще один момент заключается в том, что при сравнении токенов JWT (https://jwt.io) из C# и токенов, полученных в приложении Frontend, обнаруживаются некоторые другие атрибуты.< /п>

Подробнее здесь: https://stackoverflow.com/questions/688 ... pplication
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»