代码之家  ›  专栏  ›  技术社区  ›  bielu000

JwtBearer asp net core从api获取签名密钥

  •  0
  • bielu000  · 技术社区  · 6 年前

    是否可以从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 回复  |  直到 6 年前
        1
  •  0
  •   Cody Popham    6 年前

    这里的代码只是告诉您的应用程序您想要使用JWT令牌进行身份验证,以及使用哪些参数来验证传入的请求(使用令牌)。

    您需要立即设置并终结以颁发这些令牌。。或者你说的“公钥”。

      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”-这将告诉应用程序任何与请求一起使用的令牌。。必须使用此值签名。否则它会拒绝它。

    现在-只需将[Authorize]标记添加到要保护的任何函数或控制器。

       [Authorize]
         [HttpPost]
                public IActionResult Test()
                {
        }
    

    编辑:看起来你想要某种永久性的标记。只需将新JWTtoken()行中的expires字段设置为1000年后或其他时间到期,然后将其公开广播给您想要的任何人。这是一个不安全的授权模型。