Я выполнил шаги, описанные здесь, чтобы настроить аутентификацию с помощью Entra ID, поэтому я могу войти в систему
p>
https://learn.microsoft.com/en-us/aspne ... etcore-7.0
В настоящее время у меня возникли проблемы с получением действительного токена доступа для вызова Azure DevOps и получения некоторых данных.
Я постоянно получаю код состояния: 203, фразу причины: «Неавторитетная информация».
Если бы это было 401, я бы предположил, что проблема в конфигурации моего приложения. Однако это 203, поэтому я подозреваю, что формат токена может быть неправильным. Возвращаемый токен имеет формат JWT, а не обычный формат PAT, поэтому я не знаю, как действовать.
Ниже приведен код моего клиентского приложения
Program.cs
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using testauthblazor.Client;
using testauthblazor.Client.Services;
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add("#app");
builder.RootComponents.Add("head::after");
builder.Services.AddHttpClient("testauthblazor.ServerAPI", client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
.AddHttpMessageHandler();
// Supply HttpClient instances that include access tokens when making requests to the server project
builder.Services.AddScoped(sp => sp.GetRequiredService().CreateClient("testauthblazor.ServerAPI"));
builder.Services.AddScoped();
builder.Services.AddMsalAuthentication(options =>
{
builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
options.ProviderOptions.DefaultAccessTokenScopes.Add("https://twonline.onmicrosoft.com/xxxx-x ... x/.default");
});
await builder.Build().RunAsync();
TestPage.razor
@page "/testpage"
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@using testauthblazor.Client.Services
@inject AzureDevOpsService DevOpsService
@inject IAccessTokenProvider TokenProvider
Azure DevOps Projects
@if (projects == null)
{
Loading...
}
else if (projects.Count == 0)
{
No projects found.
}
else
{
- @foreach (var project in projects)
{ - @project
}
@code {
private List projects;
protected override async Task OnInitializedAsync()
{
var result = await TokenProvider.RequestAccessToken();
if (result.TryGetToken(out var token))
{
projects = await DevOpsService.GetProjectsAsync(token.Value);
}
}
}
AzureDevOpsService.cs
public class AzureDevOpsService(HttpClient httpClient)
{
private readonly HttpClient _httpClient = httpClient;
public async Task GetProjectsAsync(string accessToken)
{
var request = new HttpRequestMessage(HttpMethod.Get, "https://dev.azure.com/wtwcrb/_apis/proj ... ersion=7.1");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var response = await _httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
var content = await response.Content.ReadAsStringAsync();
var projects = JsonDocument.Parse(content).RootElement.GetProperty("value").EnumerateArray()
.Select(p => p.GetProperty("name").GetString()).ToList();
return projects;
}
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... -rest-apis