[原创] 如有雷同纯属巧合,如有转载,请注明,谢谢爛。
如下两个service是写在两个不同的application里面的,这里并没有写对于传入参数的验证,因此需要自己去完善一下
JWT Service
在Nuget中下载 system.IdentityModel.Tokens.Jwt
JWT 这里经行token解码
在相关的Controller里面添加如下代码
[HttpPost("Login")] public async Task Login(string username, string password) { string pwd = MD5Helper.MD5Encrypt32(password); //这个MD5的方法在文章最后面有补充,当然大家也可以在网上搜更好的,更适合自己的 var userInfo = await _userInfoService.FindAsync(c=>c.UserName == username&&c.UserPwd == pwd); if (userInfo!=null) { var claims = new Claim[] { new Claim(ClaimTypes.Name,userInfo.Name), new Claim("Id",userInfo.Id.ToString()), new Claim("UserName",userInfo.UserName), ... //可以自己再加额外的 }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("Guid")); //此key要与web service端的key保持一致 var token = new JwtSecurityToken( issuer: "JWT Service url", audience: "Web Service url", claims:claims, notBefore:DateTime.Now, expires:DateTime.Now.AddHours(1), signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256)//这块有很多方式,大家可以自行选择 ); var jwtToken = new JwtSecurityTokenHandler().WriteToken(token); return APIResultHelper.Success(jwtToken); } else { return APIResultHelper.Error("UserName or Password is incorrect"); } } public static string MD5Encrypt32(string password) { string pwd = ""; MD5 md5 = MD5.Create(); byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(password)); for (int i =0; i< s.Length; i++) { pwd = pwd + s[i].ToString("X"); } return pwd; }
Web Serivce
在Nuget中下载 Microsoft.AspNetCore.Authentication.JwtBearer
.Net5是自带SwaggerUI的,如果.Net core 3.1, 请在Nuget中下载如下package
Swashbuckle.AspNetCore.Swagger
Swashbuckle.AspNetCore.SwaggerGen
Swashbuckle.AspNetCore.SwaggerUI
不确定在3.1中只下载Swashbuckle.AspNetCore是否可以配置成功Swagger, 因此建议下载如上package
在 startup.cs的ConfigureServices添加如下代码
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "TitleName", Version = "v1" }); #region Swagger Authentication c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey, Description = "", Name = "Authentication", BearerFormat = "JWT", Scheme = "Bearer" }); c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, new string[]{ } } }); #endregion }); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer( option => { option.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("Guid")),//此key要与JWT service端的保持一致 ValidateIssuer = true, ValidIssuer = "JWT Service url", ValidateAudience = true, ValidAudience = "Web Service url", ValidateLifetime = true, ClockSkew = TimeSpan.FromMinutes(60) }; });
在 startup.cs的Configure添加如下代码
中间件的顺序必须如下,不可更改。中间件的执行顺序可以看 Asp.Net Core 5.0 – Middleware
app.UseAuthentication(); //鉴权 app.UseAuthorization(); //授权
MD5的加密
public static string MD5Encrypt32(string password) { string pwd = ""; MD5 md5 = MD5.Create(); byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(password)); for (int i =0; i< s.Length; i++) { pwd = pwd + s[i].ToString("X"); } return pwd; }
如果有任何写的不好的地方,请大家指出来,我将继续改进,谢谢