将自定义客户端服务添加到 Identity Server 4 后出现 CORS 错误

get*_*ode 1 c# asp.net asp.net-core identityserver4

我已遵循Identity Server 4文档并在本地创建了一个工作测试实例。然后我按照本教程添加了一个示例 Javascript 客户端。这一切工作正常,同时仍然使用测试用户和客户端。

我现在想开始将测试数据分解为生产就绪的服务。我想我应该从我的客户开始。ConfigureServices这是我的方法中的 Identity Server 设置代码Startup

var builder = services.AddIdentityServer()
    .AddDeveloperSigningCredential()
    .AddInMemoryIdentityResources(Config.GetIdentityResources())
    .AddInMemoryApiResources(Config.GetApiResources())
    //.AddInMemoryClients(Config.GetClients())
    .AddTestUsers(Config.GetUsers());

builder.Services.AddTransient<IdentityServer4.Stores.IClientStore, CustomClientStore>();
Run Code Online (Sandbox Code Playgroud)

从字面上看,我在这里唯一更改的是注释掉该AddInMemoryClients行并添加注册新客户端存储的最后一行。现在这个CustomClientStore类所做的只是复制Config.GetClients()测试数据。

但是,当我现在运行演示 Javascript 应用程序并单击“登录”按钮时,我收到以下 Javascript 错误:

跨源请求被阻止:同源策略不允许读取 http://localhost:54458/.well-known/openid-configuration处的远程资源。(原因:CORS 标头“Access-Control-Allow-Origin”丢失)。

http://localhost:54458显然是我的 IS4 实例。我还没有触及我的 CORS 配置,如果我注释掉AddTransient上面的行并恢复该AddInMemoryClients行,一切都会再次正常工作。

谁能帮助我理解这一点?

get*_*ode 5

我通过查看 Identity Server 自己的代码找到了答案。事实证明,在使用AddInMemoryClients扩展注册测试客户端存储时,Identity Server 也同时实施了 CORS 策略。您可以在此处查看此代码

此 CORS 策略使用另一种内存中实现,这次是ICorsPolicyService. 此实现采用AllowedCorsOrigins已配置客户端的属性来确定是否允许请求源。

所以我的解决方案是创建这个扩展方法......

public static IIdentityServerBuilder AddCustomCorsPolicy(this IIdentityServerBuilder builder)
{
    var existingCors = builder.Services.Where(x => x.ServiceType == typeof(ICorsPolicyService)).LastOrDefault();
    if (existingCors != null &&
        existingCors.ImplementationType == typeof(DefaultCorsPolicyService) &&
        existingCors.Lifetime == ServiceLifetime.Transient)
    {
        builder.Services.AddTransient<ICorsPolicyService, CustomCorsPolicyService>();
    }

    return builder;
}
Run Code Online (Sandbox Code Playgroud)

...然后CustomCorsPolicyService根据我的客户群中的设置检查请求源,然后添加AddCustomCorsPolicy到我的身份服务器设置中。

  • 您可以简单地注入 services.AddTransient&lt;ICorsPolicyService, CustomCorsPolicyService&gt;(); 无需创建扩展方法 (2认同)