.Net Core WebApi 使用JWT完成鉴权和授权

1.引用程序集:System.IdentityModel.Tokens.Jwt

2.新建一个控制器(AuthoizeController),用于完成授权功能

示例代码:

using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using MyBlog.IService;
using MyBlog.JWT.Utility.ApiResult;
using MyBlog.JWT.Utility.MD5Util;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;

namespace MyBlog.JWT.Controllers
{
    /// <summary>
    /// JWT授权
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [EnableCors("any")] //设置跨域处理的 代理
    public class AuthoizeController : ControllerBase
    {
        private readonly IWriterInfoService _iWriterInfoService;

        public AuthoizeController(IWriterInfoService writerInfoService)
        {
            this._iWriterInfoService = writerInfoService;
        }

        [HttpPost("Login")]
        public async Task<ApiResult> Login(string username, string pwd)
        {
            string miwen = MD5Helper.MD5Encrypt(pwd);

            //数据校验(去数据库查询用户名和密码是否正确)
            var writerInfo = await _iWriterInfoService.FindAsync(c => c.UserName == username && c.UserPwd == miwen);
            if (writerInfo != null)
            {
                //登录成功
                var claims = new Claim[] {
                    new Claim(ClaimTypes.Name,writerInfo.Name), //可以通过this.User.Identity.Name访问到第二个参数的值
                    new Claim("Id",writerInfo.Id.ToString()),
                    new Claim("UserName",writerInfo.UserName)
                };
                var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("SDMC-CJAS1-SAD-DFSFA-SADHJVF-VF"));//密钥
                var token = new JwtSecurityToken(
                    issuer: "http://localhost:6060/",//颁发Token的web应用程序地址(当前程序)
                    audience: "http://localhost:5000/",//token接收程序的地址(WebApi)
                    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("用户名或密码错误");
            }

        }

    }
}

上面代码不能完全照搬,需要根据项目实际情况进行改动。示例中是新建了一个webapi项目,专门用于授权操作。也可以不新建项目,直接在原有的webapi项目中添加一个新的控制器。

issuer:颁发Token的web应用程序地址(当前程序)

audience:token接收程序的地址(WebApi)

上面这两个地址需要根据实际情况配置,具体查看方法是去项目的Properties文件夹,找到launchSettings.json文件。

3.在服务中进行注册

引用程序集:Microsoft.AspNetCore.Authentication.JwtBearer

在Startup.cs中添加方法AddCustomJWT

        /// <summary>
        /// JWT鉴权
        /// </summary>
        /// <param name="services"></param>
        /// <returns></returns>
        public static IServiceCollection AddCustomJWT(this IServiceCollection services)
        {
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                    .AddJwtBearer(option =>
                    {
                        option.TokenValidationParameters = new TokenValidationParameters
                        {
                            ValidateIssuerSigningKey = true,
                            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("SDMC-CJAS1-SAD-DFSFA-SADHJVF-VF")),
                            ValidateIssuer = true,
                            ValidIssuer = "http://localhost:6060/",
                            ValidateAudience = true,
                            ValidAudience = "http://localhost:5000/",
                            ValidateLifetime = true,
                            ClockSkew = TimeSpan.FromMinutes(60)
                        };
                    });
            return services;
        }

在ConfigureServices中调用AddCustomJWT完成服务的注册。

在Configure方法中启用鉴权和授权功能:

4.在控制器和action中使用鉴权功能

在控制器中使用: 

如果控制器中有单个方法不需要鉴权,则可以添加匿名访问特性(AllowAnonymous),跳过鉴权,直接访问该方法。

在action中使用:

猜你喜欢

转载自blog.csdn.net/liangmengbk/article/details/121733491