我已使用Entity Framework为我的项目设置了Identity Server 4。我已将服务配置为使用持久授权存储和签名证书。
services.AddIdentityServer()
.AddSigningCredential(Config.GetSigningCertificate())
.AddResourceOwnerValidator<ResourceOwnerPasswordValidator>()
.AddProfileService<ProfileService>()
.AddConfigurationStore(builder =>
builder.UseSqlServer(connectionString, options =>
options.MigrationsAssembly(migrationsAssembly)))
.AddOperationalStore(builder =>
builder.UseSqlServer(connectionString, options =>
options.MigrationsAssembly(migrationsAssembly)));
以下是服务的配置。
问题是当我在负载均衡器后面运行我的服务器时,例如处理所有请求的2个identic实例,用户未登录的服务器无法解码JWT令牌,导致401未经授权的错误。
我假设令牌的签名方法或他们的征名是问题,但我找不到解决这个问题的方法。
以下是我配置的其余部分。
配置:
app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
{
Authority = url,
// Authority = "http://localhost:5000",
AllowedScopes = { "WebAPI" },
RequireHttpsMetadata = false,
AutomaticAuthenticate = true,
AutomaticChallenge = true,
});
客户:
new Client
{
ClientId = "Angular2SPA",
AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, // Resource Owner Password Credential grant.
AllowAccessTokensViaBrowser = true,
RequireClientSecret = false, // This client does not need a secret to request tokens from the token endpoint.
AccessTokenLifetime = 7200, // Lifetime of access token in seconds.
AllowedScopes = {
IdentityServerConstants.StandardScopes.OpenId, // For UserInfo endpoint.
IdentityServerConstants.StandardScopes.Profile,
"roles",
"WebAPI"
},
AllowOfflineAccess = true, // For refresh token.
AccessTokenType = AccessTokenType.Jwt
}
我还实现了自己的IResourceOwnerPasswordValidator和IProfileService。
知道为什么会这样吗?
答案 0 :(得分:0)
我遇到了类似的问题,负载均衡Identity Server 4,并且能够使用Startup.cs的ConfigureServices中的.AddDataProtection()共享密钥。
public void ConfigureServices(IServiceCollection services)
{
// Other service configurations
services.AddDataProtection();
// Additional service configurations
}
作为旁注,如果您走这条路,请考虑使用扩展名(例如,您决定使用哪种媒介)对那些密钥进行加密
.ProtectKeysWith*
(有几种选择)
。有关更多信息,请参见https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/introduction?view=aspnetcore-2.1
HTH