Blazor WebAssembly 阻止 WebApi AllowAnonymous

Ven*_*son 3 c# webassembly asp.net-core blazor

我创建了一个 Blazor WebAssembly 项目,并希望提供一个具有一个公共可用函数的 WebAPI。

[Route("api/[controller]")]
[ApiController]
[Authorize]
public class SystemEvalApiController : ControllerBase
{
    public SystemEvalApiController(AppDbContext context, IMapper mapper)
    {...}

    [Route("LatestEvals")]
    [AllowAnonymous]
    public ActionResult LatestEvals()
Run Code Online (Sandbox Code Playgroud)

这是我的 Api 控制器,我应该能够通过以下方式调用它:

SystemEvalPublicViewModel = await Http
                .GetFromJsonAsync<SystemEvalPublicViewModel>(
                    HttpService.BuildUrl("api/SystemEvalApi/LatestEvals"));
Run Code Online (Sandbox Code Playgroud)

当我没有登录任何帐户时。但我得到了这个错误:

info: System.Net.Http.HttpClient.JPB.BorannRemapping.ServerAPI.LogicalHandler[100]
      Start processing HTTP request GET https://localhost:44330/api/SystemEvalApi/LatestEvals
blazor.webassembly.js:1 info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
      Authorization failed.
Run Code Online (Sandbox Code Playgroud)

看起来“DefaultAuthorizationService”无法识别匿名属性,但我找不到它直接失败的点。

如何声明无需登录即可从 HttpClient 访问 WebAPI 函数。Microsoft.AspNetCore.Components.WebAssembly.Server 3.2.0.-rc1.20223.4

编辑:这是 ClientServices 的声明:

var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("app");

builder.Services.AddHttpClient("JPB.BorannRemapping.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.AddTransient(sp => sp.GetRequiredService<IHttpClientFactory>().CreateClient("JPB.BorannRemapping.ServerAPI"));
builder.Services.AddTransient(e => new HttpService(e.GetService<HttpClient>()));
builder.Services.AddApiAuthorization();
builder.Services.AddBlazoredLocalStorage();

await builder.Build().RunAsync();
Run Code Online (Sandbox Code Playgroud)

agu*_*ars 7

因此,每次您获取它时,HttpClient它都会使用BaseAddressAuthorizationMessageHandler尝试验证请求的身份。但在这种情况下,您的请求不应经过身份验证,因此您可以执行以下操作:

登记

builder.Services.AddHttpClient("JPB.BorannRemapping.ServerAPI.Anonymous", client =>
    {
        client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress);
    });
Run Code Online (Sandbox Code Playgroud)

用法

builder.Services.AddHttpClient("JPB.BorannRemapping.ServerAPI.Anonymous", client =>
    {
        client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress);
    });
Run Code Online (Sandbox Code Playgroud)