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行,一切都会再次正常工作。
谁能帮助我理解这一点?
我通过查看 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到我的身份服务器设置中。
| 归档时间: |
|
| 查看次数: |
2977 次 |
| 最近记录: |