[原创] 如有雷同纯属巧合,如有转载,请注明,谢谢爛。
如下两个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;
}
如果有任何写的不好的地方,请大家指出来,我将继续改进,谢谢



