在 .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 的潜在安全问题。
我是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 的潜在安全问题。