此处没有。我已经完成了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
示例所做的。您只需要确保您的静态方法具有相同的函数签名。
例如,.AddAuthentication
将Action<AuthenticationOptions>
委托作为参数。因此,可以传入任何static void foo(AuthenticationOptions o)
方法。
或者,您可以编写实现IConfigureOptions<T>
的服务并注册这些服务。如果您需要访问其他服务(例如数据库(来配置这些选项类型,这一点尤其有用。