是否可以从asp.net-core配置JwtBearer,使其可以使用验证用户是否被授权所需的签名密钥(在我的情况下为公共密钥)?
我有这样的东西:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(o =>
{
o.BackchannelHttpHandler = new HttpClientHandler();
o.MetadataAddress = "http://auth-server.local.com/api";
o.Authority = "http://localhost:5000";
o.Audience = "http://localhost:5001";
o.RequireHttpsMetadata = false;
o.TokenValidationParameters = new TokenValidationParameters
{
IssuerSigningKey = "here should be public key exposed by my auth api server"
ValidIssuer = "http://localhost:5000",
ValidAudience = "http://loclhost:5001"
};
})
;
但是我的客户端不会调用我的auth api来获取公钥。
答案 0 :(得分:0)
那里的代码只是告诉您的应用程序您要使用JWT令牌进行身份验证,以及使用哪些参数来验证传入请求(带有令牌)。
您现在需要设置和终结点以发行这些令牌..或“公钥”。
您的代码(请注意发行者中的“ mysecret”)
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(o =>
{
o.BackchannelHttpHandler = new HttpClientHandler();
o.MetadataAddress = "http://auth-server.local.com/api";
o.Authority = "http://localhost:5000";
o.Audience = "http://localhost:5001";
o.RequireHttpsMetadata = false;
o.TokenValidationParameters = new TokenValidationParameters
{
IssuerSigningKey = "MySecret"
ValidIssuer = "http://localhost:5000",
ValidAudience = "http://loclhost:5001"
};
})
;
现在在控制器中:
public class AccountController : Controller
{
[HttpGet]
public IActionResult getKey()
{
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("MySecret"));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: "http://localhost:5000",
audience: "http://localhost:5001",
expires: DateTime.Now.AddYears(10),
signingCredentials: creds);
return Json(token);
}
}
请注意服务中的操作方式。.将私钥设置为“ MySecret”-这告诉应用程序与请求一起使用的任何令牌都必须使用此值签名。否则,它将拒绝。
在控制器中。我们使用相同的“ MySecret”创建密钥,并将其发布到主机/帐户/ getkey
现在-只需将[Authorize]标签添加到您要保护的任何功能或控制器中即可。
[Authorize]
[HttpPost]
public IActionResult Test()
{
}
编辑:看来您需要某种永久令牌。只需将新的JWTtoken()行中的expires字段设置为在1000年后到期,或将其公开广播给您想要的任何人。 Albiet-这是一个不安全的授权模型。