【问题标题】:JwtBearer asp net core get signing key from apiJwtBearer asp net core 从 api 获取签名密钥
【发布时间】:2018-12-20 11:16:43
【问题描述】:

是否可以从 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"
                };
            })
            ;

但我的客户没有调用我的身份验证 api 来获取公钥。

【问题讨论】:

  • 签名密钥是您的应用程序私钥。您使用它来签署 JWTtoken 并分发该令牌。当有人使用令牌调用您的应用程序时 - 应用程序检查令牌是否使用 IssuerSigningKey 中指定的值进行签名 - 也许详细说明您要完成的工作?
  • 我有 AuthService 可以在用户通过身份验证后创建令牌。此令牌是使用 RSA 创建的。如果任何用户的呼叫请求,例如对 orders.service,这个请求必须是自动的。但我想避免调用身份验证服务器,所以如果我的身份验证服务器可以通过某种 api 公开公钥,order.service 可以自己验证令牌
  • 嗯... -1 因为???
  • 嘿@bielu000 只是想让你知道我有同样的问题,可悲的是,回复的人似乎不知道他们在说什么。现在我只是在设置 WebHostBuilder 之前调用 auth 服务,但如果 auth 服务需要新证书,我希望能够更改公钥。

标签: asp.net-core jwt


【解决方案1】:

您那里的代码只是告诉您的应用程序您要使用 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 - 这是一个不安全的授权模型。

【讨论】:

  • 我没有使用对称密钥...我使用的是 RSA,所以理论上每个微服务都可以在从 AuthService 获取 PUBLIC KEY 后自行验证令牌。
  • 您无法将服务 .AddJWTBearer() 配置为与 RSA 一起使用。我很容易理解,但我无法帮助您。
  • 看看这个你就会明白我要存档的developer.okta.com/blog/2018/03/23/…
猜你喜欢
  • 1970-01-01
  • 2021-11-25
  • 2018-01-29
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 2020-11-19
相关资源
最近更新 更多