在 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);
    }
}