Сценарий 1 (из внешнего приложения):
- Пользователь вводит свои учетные данные в приложение React.
- Вызов осуществляется на https://login.microsoftonline.com/{tena ... /authorize endpoint.< /li>
Идентификатор токена извлекается (пока все хорошо) - Когда аутентифицированный пользователь отправляет запрос к любой конечной точке частного веб-API, Вызов следующей конечной точки: https://login.microsoftonline.com/{tena ... v2.0/token выполняется с прикреплением идентификатора токена из шага 3.
- Новый Токен JWT получен.
- Этот токен JWT прикрепляется к заголовкам запроса, сделанного к веб-API.
- Ответ возвращается в приложение React. .
А теперь новый сценарий:
Сценарий 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();
}
}
Итак, у меня разные мысли по этому поводу:< /p>
- Я не совсем уверен, пропустил ли я шаг в этом коде C# по сравнению с шагами в сценарии 1.
- Или мне нужно настроить какой-либо специальный доступ/разрешения в Azure для веб-API, который уже зарегистрирован в Azure AD.
- Следует ли мне попытаться выполнить те же действия на C#?
- Сначала позвоните: https://login.microsoftonline.com/{tena ... /authorize endpoint
- а затем https://login.microsoftonline.com/{tena ... v2.0/token, чтобы получить действительный токен JWT
Подробнее здесь: https://stackoverflow.com/questions/688 ... pplication
Мобильная версия