gpt4 book ai didi

c# - 在 Blazor wasm 中自动将访问 token 附加到 HTTP 客户端

转载 作者:行者123 更新时间:2023-12-04 01:17:39 24 4
gpt4 key购买 nike

我正在为我的 Blazor wasm 应用程序使用开放 id 连接身份提供程序,并希望将访问 token 附加到 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 调用时都必须获取访问 token 。 TokenProvider 是 IAccessTokenProvider 类型,是被注入(inject)的。

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?

最佳答案

已经明确表示有two ways为传出请求配置消息处理程序,建议实现自定义消息处理程序。再一次............您实现了一个自定义消息处理程序以配置消息处理程序。这是定制的唯一目的。当然,您可以重写 SendAsync 方法,如果有这样的操作,您就知道自己在做什么,并且做得恰当。但不能作为一种引入错误并实际上使 SendAsync 无效的方法。

这是自定义消息处理程序的实现:

using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.WebAssembly.Authentication;

--

public class CustomAuthorizationMessageHandler : AuthorizationMessageHandler
{
public CustomAuthorizationMessageHandler(IAccessTokenProvider provider,
NavigationManager navigationManager)
: base(provider, navigationManager)
{
ConfigureHandler(
authorizedUrls: new[] { "https://localhost:44370" });

}
}

以上解决了你遇到的问题……也就是说,配置了scopes属性(scopes: new[] { "admin"});),可以省略。

以下是一些改进代码的建议:如下创建一个命名的 HttpClient 服务。

builder.Services.AddTransient(sp => sp.GetRequiredService<IHttpClientFactory> 
().CreateClient("ServerAPI"));

然后像这样将它注入(inject)到你的组件中:@inject HttpClient Http

并像这样使用它:

protected override async Task OnInitializedAsync()
{
try
{
message= await Http.GetFromJsonAsync<string>("api/message");
}
catch (AccessTokenNotAvailableException exception)
{
exception.Redirect();
}
}

注意:为了使用 GetFromJsonAsync 方法,您应该安装System.Net.Http.Json 包

请注意,以上是处理 Http 请求的正确方法。这包括将用户重定向到登录页面。当然,您可以生成任何想要显示给用户的消息,但重定向是正确的方式。

应用上述建议的更改后,您的 Program.Main 方法应具有以下设置(注意顺序):

builder.Services.AddScoped<CustomAuthorizationMessageHandler>();

builder.Services.AddHttpClient("ServerAPI", client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
.AddHttpMessageHandler<CustomAuthorizationMessageHandler>();

builder.Services.AddTransient(sp =>
sp.GetRequiredService<IHttpClientFactory>().CreateClient("ServerAPI"));

关于c# - 在 Blazor wasm 中自动将访问 token 附加到 HTTP 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63076954/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com