EntityFramework 的 IdentityServer4 CORS 设置

IdentityServer4 CORS Settings with EntityFramework

编辑: 我部分回答了我的问题。对于那些好奇的人,数据库中还有另一个名为 ClientProperties 的 table,您可以使用它来设置不在主客户端 table 上的其他属性。我这样做了,但我仍然有一个错误:

我的客户端配置条目如下所示:

进一步研究(我手动定义了内容策略),这是我遇到的错误:

--------------------原始问题--------------------

我使用 EntityFramework 为我的配置和操作数据设置了 IdentityServer4。

我 运行 在尝试允许 ajax 处理登录到应用程序时的重定向时遇到问题。我没有尝试对所有内容进行硬编码,而是尝试在 IDS4 中设置 CORS。

我正在阅读文档 HERE. It talks about setting up AllowedCorsOrigins on the client so that the identity server will correctly setup CORS. The issue I am having is that in the database, the clients do not have a column called AllowedCorsOrigins defined. In fact there are a lot of missing columns as defined on the openId model

在我的身份服务器上,我的DI配置如下:

services.AddIdentity < IdentityUser, IdentityRole > ()
  .AddUserManager < ApplicationUserManager < IdentityUser >> ()
  .AddSignInManager < ApplicationSignInManager < IdentityUser >> ()
  .AddEntityFrameworkStores < ApplicationDbContext > ();

services.AddIdentityServer()
  .AddAspNetIdentity < IdentityUser > ()
  .AddConfigurationStore(options => {
    options.ConfigureDbContext = builder => builder.UseSqlServer(
      configuration.GetConnectionString("IdentityConnection"),
      opt => opt.MigrationsAssembly(startupName));
  })
  .AddOperationalStore(options => {
    options.ConfigureDbContext = builder => builder.UseSqlServer(
      configuration.GetConnectionString("IdentityConnection"),
      opt => opt.MigrationsAssembly(startupName));
  })
  .AddProfileService < ApplicationProfileService < IdentityUser >> ()
  .AddDeveloperSigningCredential();

在我的客户端上,DI 设置如下:

services.AddAuthentication(options => {
    options.DefaultScheme = "cookie";
    options.DefaultChallengeScheme = "oidc";
  }).AddCookie("cookie")
  .AddOpenIdConnect("oidc", options => {
    options.Authority = appSettings.App.AuthorityUrl;
    options.ClientId = appSettings.App.ClientId;
    options.ClientSecret = appSettings.App.ClientSecret;

    options.ResponseType = ResponseTypes.Code;
    options.UsePkce = true;
    options.ResponseMode = "query";

    options.GetClaimsFromUserInfoEndpoint = true;
    options.ClaimActions.MapJsonKey("role", "role", "role");
    options.ClaimActions.MapJsonKey("nickname", "nickname", "nickname");
    options.ClaimActions.MapJsonKey(JwtClaimTypes.Picture, JwtClaimTypes.Picture, JwtClaimTypes.Picture);
    options.TokenValidationParameters.RoleClaimType = "role";

    var test = options.ClaimActions;

    options.Scope.Add(appSettings.App.Scopes[0]);
    options.SaveTokens = true;
  });

我无法确定应该在哪里定义 AllowedCorsOrigins,因为我看到的所有示例都在内存示例中。我认为这个 属性 应该在客户端的数据库中 table...

下面是我在数据库中可以访问的值:

最后这是控制台中的错误:

问题在于AJAX。

因为我 post 表单到 MVC 中的登录端点,响应不能是 302 重定向。这是因为 AJAX 不允许在 post 上重定向。

为了解决这个问题,我现在 return 使用 return URL 创建一个 JSON 对象,并让 javascript 设置 window.location 值代替。下面是一个例子(注意我首先检查它是否是一个 JSON 对象,因为这个处理程序处理多个 ajax 调用)。

if (xhr.responseText.startsWith('{')) {
    let json = JSON.parse(xhr.responseText);
    if (json.ok) {
        window.location = json.redirect;
        return;
    }
}

如果您尝试定义客户端可能请求登录的域,您需要在 ClientCorsOrigins table 中进行设置。在那里您将定义一个网址,例如 https://www.example.com 和来自 Clients table.

的客户端 ID

但是,如果您尝试为针对 Identity Server 的其他 API 调用定义 CORS 配置,则需要在 Startup.cs

中进行定义
services.AddCors(options =>
{
    options.AddPolicy(name: MyAllowSpecificOrigins,
        builder =>
        {
            builder.WithOrigins("http://example.com",
                "http://www.contoso.com");
        });
});