【问题标题】:In Blazor WASM, how can I create a service that doesn't use authentication?在 Blazor WASM 中,如何创建不使用身份验证的服务?
【发布时间】:2021-01-08 14:14:15
【问题描述】:

为了安全起见,我创建了一个带有“个人帐户”的 ASP.NET 托管项目。 “.Client”应用程序在 Program.cs 类中附带以下内容。

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

// Supply HttpClient instances that include access tokens when making requests to the server project
builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>)
    .CreateClient("BlazorApp1.ServerAPI"));

我知道第一行创建了一个 HttpClient 服务,它为每个请求添加一个令牌。第二行将此 HTTP 客户端添加到任何其他请求“HttpClient”的服务。

如果我向 Program 类添加服务:

builder.Services.AddScoped<IPostService, PostService>();

看起来像这样:

public class SomeService: ISomeService
{
    private readonly HttpClient _httpClient;

    public UserActivityService(HttpClient httpClient)
    {
      _httpClient = httpClient;
    }

    public async Task<SomeOutputClass> Get()
    {
      return await _httpClient.GetFromJsonAsync<SomeOutputClass>($"{apiUrl}");
    }
}

那么服务将始终使用“BlazorApp1.ServerAPI”HttpClient,这需要身份验证。

我想要做的是能够拥有一个不使用此“BlazorApp1.ServerAPI”HttpClient,但使用不需要授权的 HttpClient 的单独服务。有没有办法做到这一点?也许通过创建一个单独的、命名为 HttpClient 并传递给服务,例如:

builder.Services.AddScoped<IPostService, PostService>(OtherHttpClient);

【问题讨论】:

  • 你不能这样做吗:builder.Services.AddScoped&lt;IPostService, PostService&gt;(sp =&gt; new PostService(new HttpClient(){ //Customize httpclient config }));?或者定义一个static 并通过它。
  • 感谢您的回复。我不知道如何“自定义 httpclient 配置”或创建一个静态配置并通过它。因此我被困住了。

标签: blazor asp.net-core-identity blazor-webassembly


【解决方案1】:

您可以像这样根据每个服务注册多个具有不同配置的http客户端:

程序.cs

builder.Services.AddHttpClient<IPostService, PostService>(client =>
{
   client.BaseAddress = new Uri("https://apiUrl");
});

那么你的服务应该是这样的:

public class PostService : IPostService
{
    private readonly HttpClient httpClient;

    public PostService (HttpClient httpClient)
    {
      this.httpClient = httpClient;
    }

    public Task<SomeType> Get()
    {
      return await _httpClient.GetFromJsonAsync<SomeOutputClass>($"{apiUrl}");
    }
}

来自微软Docs的更多信息

【讨论】:

  • 谢谢!这正是我想要的。
猜你喜欢
  • 2021-04-30
  • 2021-11-05
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
相关资源
最近更新 更多