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

Posted

技术标签:

【中文标题】路径不适用于 Blazor 中允许的 IdentityServer CORS 端点,但适用于 Postman【英文标题】:Path was not for an allowed IdentityServer CORS endpoint from Blazor, but works in Postman 【发布时间】:2020-02-12 20:24:48 【问题描述】:

在不同的项目中有一个带有 IdentityServer4 的 Identity 用户数据库 API 和一个 Blazor 客户端。我可以通过 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);
    

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

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

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

回答

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

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

【问题讨论】:

你好吗AllowedCorsOrigins ?显示 IdentityServer ConfigureService 的代码 【参考方案1】:

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

services.AddCors(options =>
        
            options.AddPolicy("CorsPolicy",
                builder => builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader());
        );

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

app.UseCors("CorsPolicy");

【讨论】:

谢谢,但为什么它在 Postman 中有效,而在 Blazor 中无效? 嗯,一个简单的答案是 Postman 是一个开发工具,而不是浏览器。你可以在这里找到讨论***.com/questions/36250615/cors-with-postman。 你是对的,现在它可以工作了,我也知道为什么@LucaBNW 我错过了这部分 app.UseCors("CorsPolicy"); 允许any 来源并不是一个好主意。它完全绕过了 SOP 的目的。

以上是关于路径不适用于 Blazor 中允许的 IdentityServer CORS 端点,但适用于 Postman的主要内容,如果未能解决你的问题,请参考以下文章

javascript 变量中允许的最大整数是多少? [复制]

Python 函数名中允许的字符

如何限制连接到 GCDWebServer 中允许的 IP

如何将文本字段中允许的最大输入值限制为 10? [复制]

Angular 1.6.3 不允许 1.5.8 中允许的 JSONP 请求

如何限制文本框中允许的字符数?