我正在为我的 Blazor wasm 应用程序使用一个 open id connect 身份提供程序,希望像这篇文章所述的那样将访问令牌附加到 http 客户端。
然而,每当我创建 http 客户端并尝试使用它时,即使已登录,我也会收到 AccessTokenNotAvailableException 异常。
这是我的代码:
在 Program.cs 中:
我该如何修复这个问题,以免每次都出现AccessTokenNotAvailableException异常?
然而,每当我创建 http 客户端并尝试使用它时,即使已登录,我也会收到 AccessTokenNotAvailableException 异常。
这是我的代码:
在 Program.cs 中:
// Add service for CustomAuthorizationMessageHandler
builder.Services.AddScoped<CustomAuthorizationMessageHandler>();
// Http client for requests to API
builder.Services.AddHttpClient("API", client =>
{
// Set base address to API url
client.BaseAddress = new Uri("https://localhost:44370");
// Set request headers to application/json
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
}).AddHttpMessageHandler<CustomAuthorizationMessageHandler>();
// Auth0 authentication setup
builder.Services.AddOidcAuthentication(options =>
{
builder.Configuration.Bind("Auth0", options.ProviderOptions);
options.ProviderOptions.ResponseType = "code";
});
CustomAuthorizationHandler.cs
public class CustomAuthorizationMessageHandler : AuthorizationMessageHandler
{
public CustomAuthorizationMessageHandler(IAccessTokenProvider provider,
NavigationManager navigationManager)
: base(provider, navigationManager)
{
ConfigureHandler(
authorizedUrls: new[] { "https://localhost:44370" },
scopes: new[] { "admin" });
}
}
尝试访问API时
try
{
var client = ClientFactory.CreateClient("API");
message = await client.GetStringAsync("api/message");
}
catch (AccessTokenNotAvailableException e)
{
message = "You CANNOT access the api. Please log in";
}
目前,当我在 Program.cs 中删除 AddHttpMessageHandler 调用时,下面的代码可以从API获取消息,但我不想每次调用API时都需要获取访问令牌。 TokenProvider 是 IAccessTokenProvider 类型,被注入其中。
var client = ClientFactory.CreateClient("API");
using (var requestMessage = new HttpRequestMessage(HttpMethod.Get, "api/message"))
{
var tokenResult = await TokenProvider.RequestAccessToken();
if (tokenResult.TryGetToken(out var token))
{
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.Value);
var response = await client.SendAsync(requestMessage);
if(response.IsSuccessStatusCode)
{
message = await response.Content.ReadFromJsonAsync<string>();
}
else
{
message = await response.Content.ReadAsStringAsync();
}
}
else
{
message = "You CANNOT access the api. Please log in";
}
}
我该如何修复这个问题,以免每次都出现AccessTokenNotAvailableException异常?
Program.cs
设置中看不到像Auth0文章中提到的AddOidcAuthentication()
。 - CobyC