【发布时间】:2020-07-24 15:44:16
【问题描述】:
我正在为我的 Blazor wasm 应用程序使用开放 id 连接身份提供程序,并希望将访问令牌附加到 http 客户端,如 this 文章中所述。
但是,每当我创建 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?
【问题讨论】:
-
您使用的是什么身份提供程序? IdentityServer4 还是别的什么?
-
@CobyC 我们正在使用 Auth0
-
@CobyC 我编辑了我的帖子以在 Program.cs 中展示我的 Auth0 oicd 实现
-
@CobyC 我使用那篇 Auth0 文章来设置身份验证
标签: c# asp.net-core blazor blazor-client-side blazor-webassembly