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");
});
});
编辑:
我部分回答了我的问题。对于那些好奇的人,数据库中还有另一个名为 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.
但是,如果您尝试为针对 Identity Server 的其他 API 调用定义 CORS 配置,则需要在 Startup.cs
services.AddCors(options =>
{
options.AddPolicy(name: MyAllowSpecificOrigins,
builder =>
{
builder.WithOrigins("http://example.com",
"http://www.contoso.com");
});
});