JwtBearer ASP Net Core从API获取签名密钥

时间:2018-07-12 09:29:49

标签: asp.net-core jwt

是否可以从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来获取公钥。

1 个答案:

答案 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-这是一个不安全的授权模型。