当前位置: 首页 > 知识库问答 >
问题:

Cors策略问题Blazor WASM、Web API和Identity Server 4和IIS

公冶元青
2023-03-14

我得到Cors策略错误时,试图做POST请求到Web api从我的WASM blazor应用程序。

CORS策略阻止从http://localhost:8080/DashboardService/TestConnectionhttps://localhost:8081获取数据:请求的资源上不存在访问控制允许来源标头。如果不透明的响应满足您的需求,请将请求的模式设置为no-cors,以在禁用CORS的情况下获取资源。

我在调试模式下没有问题,只有IIS发布

Startup.cs(WEB API)

   public class Startup
{
    #region Fields/Attributes

    private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

    private readonly IConfiguration configuration;

    #endregion Fields/Attributes

    #region Constructors

    /// <summary>
    /// Initializes a new instance of the <see cref="Startup"/> class.
    /// </summary>
    /// <param name="configuration">The configuration identifier</param>
    public Startup(IConfiguration configuration)
    {
        logger.Trace($"{GetType().FullName} constructed");
        this.configuration = configuration;
    }

    #endregion Constructors

    #region Methods

    /// <summary>
    /// This method gets called by the runtime. Use this method to add services to the container.
    /// </summary>
    /// <param name="services">The service collection identifier</param>
    public void ConfigureServices(IServiceCollection services)
    {
       

        // Statistics And Monitoring Service
        services.AddSingleton<IDashboardService, DashboardService>();
        services.AddSingleton<IManualLogsService, ManualLogsService>();

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

        services.AddCors(options => options.AddPolicy("CorsPolicy2",
        builder =>
        {
            builder.WithOrigins("https://localhost:8081").AllowAnyHeader()
                   .AllowAnyMethod()
                   .AllowCredentials();
        }));

        services.AddSignalR(options =>
        {
            options.EnableDetailedErrors = true;
            options.MaximumReceiveMessageSize = long.MaxValue;
            options.ClientTimeoutInterval = TimeSpan.FromSeconds(240);
            options.KeepAliveInterval = TimeSpan.FromSeconds(120);
        })
      

        string identityServerAuthority =  "https://localhost:8082";


        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, opt =>
            {
                opt.RequireHttpsMetadata = false;
                opt.Authority = identityServerAuthority;
                opt.Audience = "backend"; 
            });

     
        logger.Trace($"Services configured");
    }

    /// <summary>
    /// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    /// </summary>
    /// <param name="app">The application builder identifier</param>
    /// <param name="env">The web host environement identifier</param>
    /// <param name="agentsService">The AgentsService identifier</param>
    /// <param name="collectedValueConverter">The CollectedValueConverter identifier</param>
    /// <param name="databaseConnectionService">The DatabaseConnectionService identifier</param>
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE0060:Remove unused parameter", Justification = "Dependency injecting only to force instantiation of Singletons")]
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IDataBaseServiceApplicationConfig dataBaseServiceApplicationConfig, IAgentsService agentsService, IMachineStructureService machineStructureService, ICollectedValueConverter collectedValueConverter, IDatabaseConnectionService databaseConnectionService)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            //app.UseHsts();
        }
        //app.UseHttpsRedirection();

        app.UseRouting();

        app.UseCors("CorsPolicy2");
        app.UseAuthentication();

        app.UseAuthorization();

        app.UseStaticFiles();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers(); 
            endpoints.MapHub<BackEndHub>("/DashboardService");
        });
    }

    #endregion Methods
}

我在我的控制器上有[授权]属性,如果我删除它们,它会工作。。。

有人能帮我吗?提前谢谢

日亨

共有2个答案

耿炎彬
2023-03-14

问题解决:我转到windows中的事件查看器,看到了真正的错误,这是一个SSL证书问题。我的后端是http,identity server不接受这种方式。我们将后端转换为https并使用开发证书。我们面临同样的问题,但这一次是个人存储的证书,不受信任。管理此操作的步骤:Windows-

谢谢大家的帮助。

越文康
2023-03-14

我看到的第一个问题是这两行的顺序不对:

 app.UseAuthorization();
 app.UseAuthentication();

您应该始终在授权之前进行身份验证。

您还应该知道,在识别服务客户端定义中有一个单独的CORS设置,但是这些设置(如果我没有错的话)仅在调用识别服务器终结点时应用。

 类似资料:
  • 我试图生成一个简单的axios请求,如下所示(我正在使用vue.js): 但我得到以下错误: 我已经尝试过添加下面的头,但仍然不起作用 但是如果我尝试通过浏览器发出请求(简单地通过复制和粘贴url),一切都很好。 有人知道怎么帮我吗?非常感谢!

  • 我有以下步骤在批处理工作。 当某个异常抛出时,我在parseStepSkipListener中捕捉他并登录数据库。 我期待以下行为: 作业已启动 执行前面的步骤 开始执行解析步骤 阅读项目 进程项 写 哦,异常。 捕获异常,登录数据库,转到下一个块(读取、处理、写入)。 作业已启动 执行前面的步骤 开始执行解析步骤 阅读项目 进程项 写 哦,异常。 进程项 写入项 哦,异常。 捕获异常,登录数据库

  • 我们正在开发一个Spring Boot程序和angularjs应用程序。我们使用JWT令牌和LDAP身份验证。LDAP身份验证后,service生成jwt令牌并发送给angular,从下一次开始,angular将令牌和用户名发送回service,angular将令牌存储在会话存储中。 有人能解决这个问题吗????

  • 我和我的朋友在我们的应用编程接口和角客户端上遇到了CORS问题。我们试图建立一个链接,我们正在使用SignalR和客户端(Angular 7)注册自己来接收来自服务器(ASP)的消息。NET核心2.2)。 在浏览器控制台中,我收到以下消息: CORS策略阻止了对来自http://localhost:4200的https://ourEndpoint/坐标中心/谈判的XMLHttpRequest的访问

  • 我正在尝试使用Java读取excel(.xls和.xlsx)。我能正确地阅读xlsx。但当我使用以下代码读取xls文件时 我犯错了 java.lang.nosuchmethoderror:org.apache.poi.hssf.usermodel.hssfrow.getcell(ilorg/apache/poi/ss/usermodel/row$missingcellpolicy;)log/apa

  • 问题内容: 我试图在获得图像之前先在画布上绘制图像,但是返回的数据就像是空的。 当我在控制台中检查它时,我发现字符串中有很多:() 当我尝试将画布附加到文档时,也没有绘制任何内容,并且控制台中没有引发任何错误。 这里有什么问题 ? 这是我的代码: 另外,进行快速刷新时,图像会正确绘制到画布上,但是控制台中出现错误消息,并且为空。 Firefox中的消息是: “ SecurityError:操作不安