oauth2.0 使用Auth0保护Blazor WASM和API,CORS策略问题

snz8szmq  于 2022-11-28  发布在  其他
关注(0)|答案(1)|浏览(251)

bounty将在20小时后过期。回答此问题可获得+50声望奖励。Kman希望吸引更多人关注此问题。

我一直在Auth 0上学习使用Aut 0保护Blazor WASM和API的教程,该教程位于--〉https://auth0.com/blog/securing-blazor-webassembly-apps/
保护应用程序的安全工作得很好,但是添加API给我带来了问题。一旦我向API控制器添加authenticate属性,它就会导致以下结果:
fetchdata:1从源“https://localhost:7298”获取“https://localhost:7226/weatherforecast”的访问权限已被CORS策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明响应满足您的需要,请将请求的模式设置为“no-cors”以在禁用CORS的情况下提取资源。
我添加了一个策略,允许程序中的应用程序。cs

builder.Services.AddCors(options =>
{
  options.AddPolicy("Open", builder => builder.WithOrigins("https://localhost:7298").AllowAnyMethod().AllowAnyHeader());
});

我已经在program.cs上做了一些尝试,还在身份验证/授权之前添加了app.UseCors(作为我在网上找到的一个提供的解决方案),这又导致了另一个问题。
无法加载资源:服务器以状态401()响应
我是一个很棒的人。[100]呈现组件时出现未经处理的异常:输入不包含任何JSON标记。当isFinalBlock为true时,输入应以有效的JSON标记开头。路径:$|行号:0|行内字节位置:0.系统.文本.Json.jsonException:输入不包含任何JSON标记。当isFinalBlock为true时,输入应以有效的JSON标记开头。路径:$|行号:0|行内字节位置:0.
该错误似乎指示未设置bearertoken的问题,但它是使用BaseAddressAuthorizationMessageHandler设置的。

builder.Services.AddHttpClient("APIClient", client =>
{
  client.BaseAddress = new Uri("https://localhost:7226");
  client.DefaultRequestHeaders.Clear();
  client.DefaultRequestHeaders.Add(HeaderNames.Accept, "application/json");
}).AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();

我已经将项目添加到GitHub,如果您对代码的更多细节感兴趣https://github.com/obrungot/BlazorAuthenticationPlayGround.git

wz8daaqr

wz8daaqr1#

AddCors除了添加策略外,实际上什么都不做。它不会使用该策略,除非你在某处指定它。你可以使用app.UseCors("Open")指定全局策略,将策略添加到端点路由,例如app.MapGet("/test", () => Results.Ok("test")).RequireCors("Open"),或者使用[EnableCors("Open")]这样的属性为控制器添加策略。
您收到的401提示一般来说Cors似乎可以工作,但是Cors还需要显式权限来保留Authorization头。这可以通过在策略中添加“AllowCredentials()”来完成,如下所示:

builder.Services.AddCors(options =>
{
    options.AddPolicy("Open", builder => builder
        .WithOrigins("https://localhost:7298")
        .AllowAnyMethod()
        .AllowAnyHeader()
        .AllowCredentials()
    );
});

我希望这对你有帮助!

相关问题