一、 管理员添加
这个其实没什么好说的。在Controller文件中添加WriterInfoController的控制台。
然后复制下面的代码,就是添加管理员,和前面的代码差不多。
/// <summary>
/// 添加管理员
/// </summary>
/// <param name="name"></param>
/// <param name="username"></param>
/// <param name="userpwd"></param>
/// <returns></returns>
[HttpPost("Create")]
public async Task<ApiResult> Create(string name, string username, string userpwd)
{
WriterInfo writer = new WriterInfo
{
Name = name,
UserName = username,
UserPwd = MD5Helper.MD5Encrypt32(userpwd)
};
var oldWriter = await _iWriterInfoService.FindAsync(c => c.UserName == username);
if (oldWriter != null)
{
return ApiResultHelper.Error("账号已经存在");
}
bool b = await _iWriterInfoService.CreateAsync(writer);
if (!b)
{
return ApiResultHelper.Error("添加失败");
}
else
{
return ApiResultHelper.Success(writer);
}
}
后面还有一个修改用户名的API,但是要使用到登录的用户,修改用户名只能修改自己的(暂时这样设计),在登录我们要使用到JWT。
二、 管理员登录(JWT的使用)
1、首先我们要引入Jwt的NUgat包
2、Controller文件中添加AuthoizeController的控制台
/// <summary>
/// 登录操作接口
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class AuthoizeController : ControllerBase
{
/// <summary>
/// 构造函数
/// </summary>
private readonly IWriterInfoService _iWriterInfoService;
/// <summary>
/// 接口实例
/// </summary>
/// <param name="iWriterInfoService"></param>
public AuthoizeController(IWriterInfoService iWriterInfoService)
{
_iWriterInfoService = iWriterInfoService;
}
/// <summary>
/// 登录
/// </summary>
/// <param name="username"></param>
/// <param name="userpwd"></param>
/// <returns></returns>
[HttpPost("Login")]
public async Task<ApiResult> Login(string username, string userpwd)
{
//密码转换为MD5
string pwd = MD5Helper.MD5Encrypt32(userpwd);
//验证
var writer = await _iWriterInfoService.FindAsync(c => c.UserName == username && c.UserPwd == pwd);
if (writer != null)
{
//登录成功,保存token
var claims = new Claim[]
{
new Claim(ClaimTypes.Name,writer.Name),
new Claim("Id",writer.Id.ToString()),
new Claim("UserName",writer.UserName)
};
//密钥
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("SDM-CJAS1-SAD-DFSFA-SADHJVF-VF"));
//这里的Issuer和audience,可以在launchSettings.json找到
//其他的自己百度查查吧
var token = new JwtSecurityToken(
issuer: "http://localhost:33207",
audience: "http://localhost:5000",
claims: claims,
notBefore: DateTime.Now,
expires: DateTime.Now.AddDays(1),
signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256)
);
var jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
return ApiResultHelper.Success(jwtToken);
}
else
{
return ApiResultHelper.Error("账号或密码错误!");
}
}
}
三、Swagger组件 使用JWT,授权验证
1、配置Swagger使用JWT
#region 注册系统Swagger组件
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "Dome.WebApi", Version = "v1" });
c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey,
Description = "直接在下框中输入Bearer {Token}(注意两者中间是一个空格)",
Name = "Authorization",
BearerFormat = "JWT",
Scheme = "Bearer"
});
c.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference=new OpenApiReference
{
Type=ReferenceType.SecurityScheme,
Id="Bearer"
}
},
new string[]{ }
}
});
});
#endregion
2、配置完成后,运行项目,你会发现页面中多了一个这样的,在这里可以将Taken授权。
3、在管道中配置Jwt授权
引入到ConfigureServices。
/// <summary>
/// JWT鉴权
/// </summary>
/// <param name="services"></param>
/// <returns></returns>
public static IServiceCollection AddCustomJWT(this IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options=> {
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("SDM-CJAS1-SAD-DFSFA-SADHJVF-VF")),
ValidateIssuer = true,
ValidIssuer = "http://localhost:33207",
ValidateAudience=true,
ValidAudience= "http://localhost:5000",
ValidateLifetime=true,
ClockSkew=TimeSpan.FromSeconds(60)
};
});
return services;
}
Configure引入授权
4、创建新的控制台JwtTestController.cs。(这个控制台主要是为了测试。)
有 [Authorize]是需要授权的,没有则不需要
四、测试
1、运行项目
2、先测试没有登录的情况下。
没有登录的情况下,NoAuthorize能正常的运行
没有登录的情况下,Authorize被拦截,提示未授权
3、登录
登录成功后,复制token生成的密钥
4、浏览器授权。
5.授权成功,提示“Authoruzed”为授权成功
6.测试在登录成功的时候
测试中发现,会显示Token密钥,然后返回成功。
7,测试完成后说明能正常的使用Jwt了。
可以不同的API上添加[Authorize],如果想要整个控制台都需要登录可以在控制台的上方添加[Authorize],如图。