ASP.NET Core3.1 Ocelot认证的实现
在第二末节先容JWT Token认证时辰,我们都知道一样平常发送用户名和暗码获取Token那是由Identity4来完成的,包罗验证用户,天生JWT Token。也就是说Identity Server承载了JWT Token认证成果。为了行使IdentityServer承载Token,请像往常一样在ConfigureServices中行使方案(密钥)注册IdentityServer处事。假如您不知道怎样执行此操纵,请查阅IdentityServer文档。 public void ConfigureServices(IServiceCollection services) { var authenticationProviderKey = "TestKey"; Action<IdentityServerAuthenticationOptions> options = o => { o.Authority = "https://whereyouridentityserverlives.com"; o.ApiName = "api"; o.SupportedTokens = SupportedTokens.Both; o.ApiSecret = "secret"; }; services.AddAuthentication() .AddIdentityServerAuthentication(authenticationProviderKey, options); services.AddOcelot(); } 在Identity4中是由Authority参数指定OIDC处事地点,OIDC可以自动发明Issuer, IssuerSigningKey等设置,而o.Audience与x.TokenValidationParameters = new TokenValidationParameters { ValidAudience = "api" }是等效的。 3.2AuthServer项目 此处事首要用于客户端哀求受掩护的资源处事器时,认证后发生客户端必要的JWT Token,天生JWT Token要害代码如下: [Route("api/[controller]")] public class AuthController : Controller { private IOptions<Audience> _settings; public AuthController(IOptions<Audience> settings) { this._settings = settings; } /// <summary> ///用户行使 用户名暗码 来哀求处事器 ///处事器举办验证用户的信息 ///处事器通过验证发送给用户一个token ///客户端存储token,并在每次哀求时附奉上这个token值, headers: {'Authorization': 'Bearer ' + token} ///处事端验证token值,并返回数据 /// </summary> /// <param></param> /// <param></param> /// <returns></returns> [HttpGet] public IActionResult Get(string name, string pwd) { //验证登任命户名和暗码 if (name == "catcher" && pwd == "123") { var now = DateTime.UtcNow; //添加用户的信息,转成一组声明,还可以写入更多用户信息声明 var claims = new Claim[] { //声明主题 new Claim(JwtRegisteredClaimNames.Sub, name), //JWT ID 独一标识符 new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), //宣布时刻戳 issued timestamp new Claim(JwtRegisteredClaimNames.Iat, now.ToUniversalTime().ToString(), ClaimValueTypes.Integer64) }; //下面行使 Microsoft.IdentityModel.Tokens辅佐库下的类来建设JwtToken //安详秘钥 var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(_settings.Value.Secret)); //声明jwt验证参数 var tokenValidationParameters = new TokenValidationParameters { //必需验证安详秘钥 ValidateIssuerSigningKey = true, //赋值安详秘钥 IssuerSigningKey = signingKey, //必需验证签发人 ValidateIssuer = true, //赋值签发人 ValidIssuer = _settings.Value.Iss, //必需验证受众 ValidateAudience = true, //赋值受众 ValidAudience = _settings.Value.Aud, //是否验证Token有用期,行使当前时刻与Token的Claims中的NotBefore和Expires比拟 ValidateLifetime = true, //应承的处事器时刻偏移量 ClockSkew = TimeSpan.Zero, //是否要求Token的Claims中必需包括Expires RequireExpirationTime = true, }; var jwt = new JwtSecurityToken( //jwt签发人 issuer: _settings.Value.Iss, //jwt受众 audience: _settings.Value.Aud, //jwt一组声明 claims: claims, notBefore: now, //jwt令牌逾期时刻 expires: now.Add(TimeSpan.FromMinutes(2)), //署名凭据: 安详密钥、署名算法 signingCredentials: new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256) ); //天生jwt令牌(json web token) var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt); var responseJson = new { access_token = encodedJwt, expires_in = (int)TimeSpan.FromMinutes(2).TotalSeconds }; return Json(responseJson); } else { return Json(""); } } } public class Audience { public string Secret { get; set; } public string Iss { get; set; } public string Aud { get; set; } } appsettings.json文件中设置认证中密钥(Secret)跟受众(Aud)信息: { "Audience": { "Secret": "Y2F0Y2hlciUyMHdvbmclMjBsb3ZlJTIwLm5ldA==", "Iss": "http://www.c-sharpcorner.com/members/catcher-wong", "Aud": "Catcher Wong" } } 3.3CustomerAPIServices项目 该项目跟APIGateway项目是一样的,为了掩护下流api处事,行使JwtBearer认证,将默认的身份验证方案配置为TestKey。在appsettings.json文件中设置认证中密钥(Secret)跟受众(Aud)信息: { "Audience": { "Secret": "Y2F0Y2hlciUyMHdvbmclMjBsb3ZlJTIwLm5ldA==", "Iss": "http://www.c-sharpcorner.com/members/catcher-wong", "Aud": "Catcher Wong" } } Startup添加身份认证代码如下: (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |