您好,欢迎来到爱玩科技网。
搜索
您的当前位置:首页基于.NET6平台开发WebApi(十一)—— 使用JWT进行用户鉴权

基于.NET6平台开发WebApi(十一)—— 使用JWT进行用户鉴权

来源:爱玩科技网

至此我们的项目已经可以正常运行了,但是聪明的你可能发现了一个问题,那就是我们在第九章中将控制器基类中的[Authorize]标记注释掉了,而且我们添加了一个CurrentUserId属性,没错,它就是为了用户鉴权使用的。用户登录可以说是WebApi必不可少的功能,本篇我们就来详细说说如何进行用户鉴权。

#region 添加校验
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        ValidAudience = "net6api.com",
        ValidIssuer = "net6api.com",
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["JwtSecurityKey"])),
    };
});
#endregion
app.UseAuthentication();
app.UseAuthorization();

3、接下来我们创建一个LoginDto类用于用户登录信息输入,一个LoginView用于用户登录信息返回,代码如下

namespace NET6.Domain.Dtos
{
    /// <summary>
    /// 用户登录
    /// </summary>
    public class LoginDto
    {
        /// <summary>
        /// 登录名
        /// </summary>
        public string LoginName { get; set; }
        /// <summary>
        /// 密码
        /// </summary>
        public string Password { get; set; }
    }
}
namespace NET6.Domain.ViewModels
{
    /// <summary>
    /// 登录信息
    /// </summary>
    public class LoginView
    {
        /// <summary>
        /// token
        /// </summary>
        public string Token { get; set; }
        /// <summary>
        /// 过期时间
        /// </summary>
        public DateTime Expires { get; set; }
        /// <summary>
        /// 用户Id
        /// </summary>
        public string Id { get; set; }
        /// <summary>
        /// 用户名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 用户头像
        /// </summary>
        public string Avatar { get; set; }
    }
}

4、接着我们创建一个新的控制器,命名为AuthController,同样继承于BaseController,添加一个登录方法,并且假设我们用户信息已经验证成功,我们给登录方法加上[AllowAnonymous]标记并将BaseController中的[Authorize]标记启用,代码如下

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using NET6.Domain.Dtos;
using NET6.Domain.ViewModels;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

namespace NET6.Api.Controllers
{
    /// <summary>
    /// 鉴权相关
    /// </summary>
    public class AuthController : BaseController
    {
        readonly IConfiguration _config;
        public AuthController(IConfiguration config)
        {
            _config = config;
        }

        /// <summary>
        /// 用户登录
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [AllowAnonymous]
        [HttpPost("login")]
        [ProducesResponseType(typeof(LoginView), StatusCodes.Status200OK)]
        public async Task<IActionResult> LoginAsync(LoginDto dto)
        {
            #region 校验用户信息,假设此处我们已经校验成功

            #endregion
            var view = new LoginView
            {
                Expires = DateTime.Now.AddDays(30)
            };
            var claims = new[] { new Claim(ClaimTypes.NameIdentifier, "") };
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["JwtSecurityKey"]));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            var token = new JwtSecurityToken(
                issuer: "net6api.com",
                audience: "net6api.com",
                claims: claims,
                expires: view.Expires,
                signingCredentials: creds);
            view.Token = new JwtSecurityTokenHandler().WriteToken(token);
            return Ok(JsonView(view));
        }
    }
}

4、编译运行,我们直接访问http://localhost:58707/address?page=1&size=15,发现返回401,表明请求未授权。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- aiwanbo.com 版权所有 赣ICP备2024042808号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务