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中使用: