在 .net 核心中创建自定义 .well-known\openid-configuration

Create custom .well-known\openid-configuration in .net core

我是JWT认证的新手,所以我想做的可能是错误的。

我正在使用非对称 RSA 密钥对来签署和验证 JWT。

在我的 startup.cs 中:

 public void ConfigureServices(IServiceCollection services) {
            services.AddControllers();
          
            services.AddSingleton<RsaSecurityKey>(provider => {
                RSA rsa = RSA.Create();
                rsa.ImportRSAPublicKey(
                    source: Convert.FromBase64String(configuration["Jwt:PublicKey"]),
                    bytesRead: out int _
                );
                
                return new RsaSecurityKey(rsa);
            });
            services.AddAuthentication()
                .AddJwtBearer("Asymmetric", options => {
                    SecurityKey rsa = services.BuildServiceProvider().GetRequiredService<RsaSecurityKey>();
                    
                    options.TokenValidationParameters = new TokenValidationParameters {
                        IssuerSigningKey = rsa,
                        ValidAudience = "audience-test",
                        ValidIssuer = "test-issuer",
                        RequireSignedTokens = true,
                        RequireExpirationTime = true,
                        ValidateLifetime = true,
                        ValidateAudience = true,
                        ValidateIssuer = true,
                    };
                });
        }

为了生成我在控制器中的令牌:

[HttpPost]
        [Route("Asymmetric")]
        public IActionResult GenerateTokenAsymmetric()
        {
            using RSA rsa = RSA.Create();
            rsa.ImportRSAPrivateKey(
                source: Convert.FromBase64String(_configuration["Jwt:PrivateKey"]),
                bytesRead: out int _);

            var signingCredentials = new SigningCredentials(
                key: new RsaSecurityKey(rsa),
                algorithm: SecurityAlgorithms.RsaSha256
            );

            DateTime jwtDate = DateTime.Now;

            var jwt = new JwtSecurityToken(
                audience: "test-audience",
                issuer: "test-issuer",
                claims: new Claim[] { new Claim(ClaimTypes.NameIdentifier, "John") },
                notBefore: jwtDate,
                expires: jwtDate.AddMinutes(1),
                signingCredentials: signingCredentials
            );

            string token = new JwtSecurityTokenHandler().WriteToken(jwt);

            return Ok(new
            {
                jwt = token
            });
        }

如您所见,我的 public 密钥存储在我的应用程序设置中。 我想使用 options.MetadataAddress 以便我的客户可以下载关于我的 api 的元数据并检索 public 密钥来验证令牌。

我的问题是:

可以在 .net 核心中创建自定义 .well-known/openid-configuration 吗?或者我必须使用 IdentityServer 例如?

感谢帮助

我认为创建自己的静态“假”页面并不难。well-known/openid-configuration 页面。但与此同时,拥有像 IdentityServer 这样的专用令牌服务将在系统增长时为您带来优势。不要忘记您还需要创建 JWKS 端点。当 AddJwBearer 处理程序向两者发出请求时。

此外,您自己完成这一切也会带来现有解决方案中已经 fixed/solved 的潜在安全问题。