如何从方法体中提取配置选项并使用Dot-Net Core 3.1中的配置类



此处没有。我已经完成了Identity Server 4的快速入门。我正在清理代码。我使用的是Net Core 3.1。我的Startup.ConfigureServices变得拥挤,我想清理它,并将配置选项和值放入一个类中,就像IdentityServer 4使用一个类来处理IdentityResources、ApiScopes、ApiResources和Client配置选项一样。

我读过很多博客文章,https://andrewlock.net/avoiding-startup-service-injection-in-asp-net-core-3/如何为自定义服务向IoC容器添加配置,但我还没有找到一种方法来提取框架服务的选项/值,例如Identity Core或services.AddAuthentication().AddOpenIdConnect()


services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies", options =>
{
options.AccessDeniedPath = "/account/denied";
})
.AddOpenIdConnect("oidc", options =>
{
/***  HOW DO I PUT THE BELOW KEY/VALUES INTO A CONFIG CLASS  ***/
options.Authority = "https://demo.identityserver.io";
options.ClientId = "server.hybrid";
options.ClientSecret = "secret";
options.ResponseType = "code id_token";

options.SaveTokens = true;

options.Scope.Clear();
options.Scope.Add("openid");

options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name", 
RoleClaimType = "role"
};
});

并使用像这样的配置类


var builder = services.AddIdentityServer()
.AddInMemoryIdentityResources(Config.IdentityResources) <-- From the Config class
.AddInMemoryApiScopes(Config.ApiScopes) <-- From the Config class
.AddInMemoryClients(Config.Clients); <-- From the Config class

因此,如果我的问题不清楚,我如何制作一个Config类并将该类传递到.AddOpenIdConnect(MyConfigClass)中以清理ConfigureServices方法(IoC Container?(

上面的代码是在IoC容器中配置服务的最佳/最干净的方式吗?我在Andrew Lock的博客文章中寻找的答案是不是我只是不明白?我假设我可以像使用IS4.AddInMemoryIdentity Resources 一样,将类传递到.AddOpenIdConnect扩展方法中

谢谢你的帮助。

所有Microsoft服务都遵循相同的Options模式。首先,您可以将这些lambda方法移动到静态方法,可能是在不同的类上。这似乎就是您的Config示例所做的。您只需要确保您的静态方法具有相同的函数签名。

例如,.AddAuthenticationAction<AuthenticationOptions>委托作为参数。因此,可以传入任何static void foo(AuthenticationOptions o)方法。

或者,您可以编写实现IConfigureOptions<T>的服务并注册这些服务。如果您需要访问其他服务(例如数据库(来配置这些选项类型,这一点尤其有用。

最新更新