在 Identity Server 4 中注入配置
Injecting configuration in Identity Server 4
我有一个请求者负责连接到 Azure Table 商店。它需要一个配置对象,包含连接字符串和从 appsettings.json
:
中提取的 table 名称
internal class UserRequester : IUserRequester {
private CloudTableClient Client { get; }
private string TableName { get; }
public UserRequester(IOptions<TableStoreConfiguration> configuration) {
CloudStorageAccount account = configuration.Value.GetCloudStorageAccount();
Client = account.CreateCloudTableClient(new TableClientConfiguration());
TableName = configuration.Value.UserLogin;
}
}
在我的 Startup.cs
中,我定义了这个对象和这样的配置:
IIdentityServerBuilder builder = services.AddIdentityServer().AddSigningCredential(certData);
builder.AddInMemoryIdentityResources(Identities.Get());
builder.AddInMemoryApiResources(Apis.GetResources());
builder.AddInMemoryApiScopes(Apis.GetScopes());
builder.Services.Configure<TableStoreConfiguration>(Configuration);
builder.Services.AddTransient<IUserRequester, UserRequester>();
builder.Services.AddTransient<IProfileService, ProfileService>();
builder.Services.AddTransient<IResourceOwnerPasswordValidator, PasswordValidator>();
编辑:
我还包括我的主机构建器 (Program.cs
):
public class Program {
public static void Main(string[] args) {
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>());
}
但是,当我尝试调用 https://localhost:{PORT}/access_token
(即调用服务)时,我在 UserRequester
构造函数中遇到异常:
Value cannot be null. (Parameter 'connectionString')
调试代码,我发现我的 TableStoreConfiguration
的构造函数从未被调用,这意味着连接字符串为空。
我假设我设置依赖项注入器的方式有问题,但我不确定我在这里做错了什么。
事实证明问题出在我的 TableStoreConfiguration
对象上。我忽略了连接字符串和 table 名称 public,因此配置方法无法为它们分配任何值。将其更改为此可解决问题:
internal class TableStoreConfiguration {
public string UserLogin { get; set; }
public string ConnectionString { get; set; }
public CloudStorageAccount GetCloudStorageAccount() {
return CloudStorageAccount.Parse(ConnectionString);
}
}
我有一个请求者负责连接到 Azure Table 商店。它需要一个配置对象,包含连接字符串和从 appsettings.json
:
internal class UserRequester : IUserRequester {
private CloudTableClient Client { get; }
private string TableName { get; }
public UserRequester(IOptions<TableStoreConfiguration> configuration) {
CloudStorageAccount account = configuration.Value.GetCloudStorageAccount();
Client = account.CreateCloudTableClient(new TableClientConfiguration());
TableName = configuration.Value.UserLogin;
}
}
在我的 Startup.cs
中,我定义了这个对象和这样的配置:
IIdentityServerBuilder builder = services.AddIdentityServer().AddSigningCredential(certData);
builder.AddInMemoryIdentityResources(Identities.Get());
builder.AddInMemoryApiResources(Apis.GetResources());
builder.AddInMemoryApiScopes(Apis.GetScopes());
builder.Services.Configure<TableStoreConfiguration>(Configuration);
builder.Services.AddTransient<IUserRequester, UserRequester>();
builder.Services.AddTransient<IProfileService, ProfileService>();
builder.Services.AddTransient<IResourceOwnerPasswordValidator, PasswordValidator>();
编辑:
我还包括我的主机构建器 (Program.cs
):
public class Program {
public static void Main(string[] args) {
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>());
}
但是,当我尝试调用 https://localhost:{PORT}/access_token
(即调用服务)时,我在 UserRequester
构造函数中遇到异常:
Value cannot be null. (Parameter 'connectionString')
调试代码,我发现我的 TableStoreConfiguration
的构造函数从未被调用,这意味着连接字符串为空。
我假设我设置依赖项注入器的方式有问题,但我不确定我在这里做错了什么。
事实证明问题出在我的 TableStoreConfiguration
对象上。我忽略了连接字符串和 table 名称 public,因此配置方法无法为它们分配任何值。将其更改为此可解决问题:
internal class TableStoreConfiguration {
public string UserLogin { get; set; }
public string ConnectionString { get; set; }
public CloudStorageAccount GetCloudStorageAccount() {
return CloudStorageAccount.Parse(ConnectionString);
}
}