路径不适用于 Blazor 中允许的 IdentityServer CORS 端点,但适用于 Postman

Hil*_*lls 2 c# asp.net-core identityserver4 blazor

在单独的项目中具有带有 IdentityServer4 和 Blazor 客户端的 Identity 用户数据库 API。我可以通过 Postman 注册一个新用户。在 Blazor 客户端中运行以下代码时(用于修补和学习)

@page "/registrer"
@using Models
@using System.Net.Http
@using IdentityModel.Client
@inject HttpClient Http

    <EditForm Model="@registerUserModel" OnValidSubmit="@HandleValidSubmit">
        <DataAnnotationsValidator />
        <ValidationSummary />

        <InputText id="email" type="email" @bind-Value="@registerUserModel.Email" />
        <InputText id="password" type="password" @bind-Value="@registerUserModel.Password" />
        <InputText id="confirmPassword" type="password" @bind-Value="@registerUserModel.ConfirmPassword" />

        <button type="submit">Registrer deg</button>
    </EditForm>

@code {
    private RegisterUserModel registerUserModel = new RegisterUserModel();

    public async Task HandleValidSubmit()
    {
        var newUser = new RegisterUserModel
        {
            Email = registerUserModel.Email,
            Password = registerUserModel.Password,
            ConfirmPassword = registerUserModel.ConfirmPassword
        };

        var client = new HttpClient();

        var response = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
        {
            Address = "https://localhost:5001/connect/token",

            ClientId = "client",
            ClientSecret = "511536EF-F270-4058-80CA-1C89C192F69A",
            Scope = "api1"
        });

        Http.SetBearerToken(response.AccessToken);

        await Http.PostJsonAsync("https://localhost:5001/register", newUser);
    }
}
Run Code Online (Sandbox Code Playgroud)

我能够获取访问令牌并验证 Blazor 客户端,但随后出现此错误

dbug:IdentityServer4.Hosting.CorsPolicyProvider[0] CORS 请求为路径:/register from origin: http://localhost:60013但被忽略,因为路径不是允许的 IdentityServer CORS 端点

为什么?当它在 Postman 中工作并且没有 CORS 政策时。曾试图让客户端使用AllowedCorsOrigins,只是为了检查。

回答

浏览器安全性可防止网页向与提供该网页的域不同的域发出请求。此限制称为同源策略。同源策略可防止恶意站点从其他站点读取敏感数据。要从浏览器向具有不同来源的端点发出请求,端点必须启用跨源资源共享 (CORS)。

将客户端机密存储在 SPA 或移动应用程序中并不是一个好主意,因为每个用户都能够查看和操作所有代码。

小智 6

确保在 IS4 API 的 ConfigureServices 方法中配置了 CORS 策略,如下所示:

services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
                builder => builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader());
        });
Run Code Online (Sandbox Code Playgroud)

还要确保在 Configure 方法中添加您的策略:

app.UseCors("CorsPolicy");
Run Code Online (Sandbox Code Playgroud)

  • 我错过了这部分 app.UseCors("CorsPolicy"); (2认同)
  • 允许“任何”来源并不是一个好主意。它完全规避了 SOP 的目的。 (2认同)