(十)管理员添加与登录

一、 管理员添加

这个其实没什么好说的。在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],如图。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值