using FakeXiecheng.API.Dtos;
using FakeXiecheng.API.Models;
using FakeXiecheng.API.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
namespace FakeXiecheng.API.Controllers
{
[ApiController]
[Route("auth")] //新建空的class ,命名为AuthenticateController ,继承ControllerBase, 配置一级路由
public class AuthenticateController : ControllerBase
{
private readonly IConfiguration _configuration; //加载配置文件
private readonly UserManager<ApplicationUser> _userManager;
private readonly SignInManager<ApplicationUser> _signInManager;
private readonly ITouristRouteRepository _touristRouteRepository;
public AuthenticateController(
IConfiguration configuration,
UserManager<ApplicationUser> userManager,
SignInManager<ApplicationUser> signInManager,
ITouristRouteRepository touristRouteRepository
)
{//通过构造方法加载数据
_configuration = configuration;
_userManager = userManager;
_signInManager = signInManager;
_touristRouteRepository = touristRouteRepository;
}
[AllowAnonymous]
[HttpPost("login")] //设置post方法的登录路由
public async Task<IActionResult> login([FromBody] LoginDto loginDto)
{//使用异步的方法登录,内部请求必须要用await
// 1 验证用户名密码
var loginResult = await _signInManager.PasswordSignInAsync( //使用jwt自带的方法验证账号密码,不需要写任何业务
loginDto.Email,
loginDto.Password,
false,
false
);
if(!loginResult.Succeeded) //如果登录状态不成功,返回错误请求
{
return BadRequest();
}
var user = await _userManager.FindByNameAsync(loginDto.Email);
//jwt 用户管理器获取用户
// 2 创建jwt
// header
var signingAlgorithm = SecurityAlgorithms.HmacSha256;//验签算法
// payload
var claims = new List<Claim>
{
// sub
new Claim(JwtRegisteredClaimNames.Sub, user.Id),
//new Claim(ClaimTypes.Role, "Admin")
};
var roleNames = await _userManager.GetRolesAsync(user);//使用jwt用户管理器获取用户权限列表
foreach(var roleName in roleNames)
{
var roleClaim = new Claim(ClaimTypes.Role, roleName);
claims.Add(roleClaim); //遍历权限依次添加到内容主体
}
// signiture
var secretByte = Encoding.UTF8.GetBytes(_configuration["Authentication:SecretKey"]);
//读取配置文件中的SecretKey,编码
var signingKey = new SymmetricSecurityKey(secretByte);
//进行对称加密算法加密
var signingCredentials = new SigningCredentials(signingKey, signingAlgorithm);
//生成签名证书(1.加密key 2.指定签名算法)
var token = new JwtSecurityToken(
issuer: _configuration["Authentication:Issuer"],
audience: _configuration["Authentication:Audience"],
claims,
notBefore: DateTime.UtcNow,
expires: DateTime.UtcNow.AddDays(1),
signingCredentials //激光防伪标志
) ;
var tokenStr = new JwtSecurityTokenHandler().WriteToken(token); //将token对象转成乱码
// 3 return 200 ok + jwt
return Ok(tokenStr);
}
[AllowAnonymous]
[HttpPost("register")] //设置注册接口路由
public async Task<IActionResult> Register([FromBody] RegisterDto registerDto)
{
// 1 使用用户名创建用户对象
var user = new ApplicationUser()
{
UserName = registerDto.Email,
Email = registerDto.Email
};
// 2 hash密码,保存用户
var result = await _userManager.CreateAsync(user, registerDto.Password);
if(!result.Succeeded)
{
return BadRequest();
}
// 3 初始化购物车
var shoppingCart = new ShoppingCart()
{
Id = Guid.NewGuid(),
UserId = user.Id
};
await _touristRouteRepository.CreateShoppingCart(shoppingCart);
await _touristRouteRepository.SaveAsync();
// 4 return
return Ok();
}
}
}
jwt 模式下实现token授权的登录注册
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 更多最新技术文章欢迎大家访问我的个人博客○( ^皿^)っ豆腐别馆 上文总览篇中,相信大家已经对接下来要做的事情有了...
- 1. 搭建一个最简单的接口示例 创建一个项目根目录 express 文件夹 安装 express 的下一个版本(5...
- 阅读本章节需要掌握springsecurity、oauth2协议、jwt 本次测试使用oauth2的授权码模式进行...
- 最近调试的项目,授权的方式使用的JWT 1.AFNetworking设置Bearer Token,通过网关验证 用...