.Net Core WebApi + Vue前后端分离项目中的jwt令牌应用
1.Start up 里面配置JWT认证方案
//认证方案
services.AddAuthentication(option =>
{
option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(
option =>
{
option.TokenValidationParameters = new TokenValidationParameters
{
//是否验证发行人
ValidateIssuer = true,
ValidIssuer = Configuration["JwtConfig:Issuer"],//发行人 //是否验证受众人
ValidateAudience = true,
ValidAudience = Configuration["JwtConfig:Audience"],//受众人 //是否验证密钥
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JwtConfig:key"])), ValidateLifetime = true, //验证生命周期 RequireExpirationTime = true, //过期时间 ClockSkew = TimeSpan.Zero //平滑过期偏移时间
};
}
);
2.appsettings.json配置JWT
"JwtConfig": {
"key": "JWTStudyWebsite_DI20DXU3",
"Issuer": "mahang",
"Audience": "wlw"
}
3. 生成令牌, 示例:登录成功生成令牌
/// <summary>
/// 登录
/// </summary>
/// <param name="RegisterEntity"></param>
/// <param name="RegisterUserPassword"></param>
/// <returns></returns>
public ResultDto Login(LoginDto loginDto)
{
ResultDto result = new ResultDto(); var registerName = registerRepository.Query(x => (x.RegisterUserName == loginDto.RegisterEntity || x.RegisterUserEmail == loginDto.RegisterEntity || x.RegisterUserPhone == loginDto.RegisterEntity)).FirstOrDefault(); var registerPassWord = registerRepository.Query(x => x.RegisterUserPassword == MD5HashUtility.MD5Hash(loginDto.RegisterUserPassword)); if (registerName == null && registerPassWord.Count() == 0)
{
result.Message = "未注册,请先注册!";
return result;
}
else
{
if (registerName == null)
{
result.Message = "用户名输入错误,请重新输入!";
return result;
}
else
{
if (MD5HashUtility.MD5Hash(loginDto.RegisterUserPassword) != registerName.RegisterUserPassword)
{
result.Message = "密码输入错误,请重新输入!";
return result;
}
else
{
//写Session或Cookies换成JWT
IList<Claim> claims = new List<Claim> {
new Claim(JwtClaimTypes.Id,registerName.RegisterUserName),
new Claim(JwtClaimTypes.Name,registerName.RegisterUserPassword)
}; //JWT密钥
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["JwtConfig:key"])); //算法
var cred = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); //过期时间
DateTime expires = DateTime.UtcNow.AddHours(10); //Payload负载
var token = new JwtSecurityToken(
issuer: configuration["JwtConfig:Issuer"],
audience: configuration["JwtConfig:Audience"],
claims: claims,
notBefore: DateTime.UtcNow,
expires: expires,
signingCredentials: cred
); var handler = new JwtSecurityTokenHandler(); //生成令牌
string jwt = handler.WriteToken(token);
result.Code = 200;
result.Message = "登录成功!";
result.Success = new LoginDto
{
RegisterEntity = loginDto.RegisterEntity,
RegisterUserPassword = loginDto.RegisterUserPassword,
Token = jwt
};
}
}
}
return result;
}
}
4.Start up 在AddSwaggerGen中配置小锁
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new OpenApiInfo { Title = "InterviewSystem.WebApi", Version = "v1" });
//xml显示swgger注释
options.IncludeXmlComments(System.IO.Directory.GetCurrentDirectory() + @"\\bin\\Debug\\net5.0\\InterviewSystem.WebApi.xml"); //开启权限小锁
options.OperationFilter<AddResponseHeadersFilter>();
options.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();
options.OperationFilter<SecurityRequirementsOperationFilter>(); //在header中添加token,传递到后台
options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
{
Description = "JWT授权(数据将在请求头中进行传递)直接在下面框中输入Bearer {token}(注意两者之间是一个空格) \"",
Name = "Authorization",//jwt默认的参数名称
In = ParameterLocation.Header,//jwt默认存放Authorization信息的位置(请求头中)
Type = SecuritySchemeType.ApiKey
});
});
5.配置相应的认证中间件和授权中间件
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "InterviewSystem.WebApi v1"));
} //启用静态文件浏览功能
app.UseStaticFiles(); //Https中间件
app.UseHttpsRedirection(); // 跨域
app.UseCors(); //路由中间件
app.UseRouting(); //认证中间件
app.UseAuthentication(); //授权中间件
app.UseAuthorization(); app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
5.在控制器中添加全局特性

6.在Vue中,登录成功后用localStorage存储Token
//登录
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
axios
.post("Login/Login", this.ruleForm)
.then((res) => {
if (res.data.Code != 200) {
this.$message.error(res.data.Message);
} else {
this.$message({
message: res.data.Message,
type: "success",
});
sessionStorage.setItem("RegisterEntity",this.ruleForm.RegisterEntity);
localStorage.setItem("Token",res.data.Success.Token)
this.$router.push("/main/IntroductionVue");
}
});
} else {
console.log("error submit!!");
return false;
}
});
},
7.Vue配置js文件,全局使用Token
import axios from "axios"
axios.defaults.baseURL = "https://localhost:44386/api/";
axios.defaults.headers.common['Authorization'] = `Bearer ${localStorage.getItem("Token")}`;
export default axios
.Net Core WebApi + Vue前后端分离项目中的jwt令牌应用的更多相关文章
- 喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了
折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...
- 两个开源的 Spring Boot + Vue 前后端分离项目
折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...
- Springboot+vue前后端分离项目,poi导出excel提供用户下载的解决方案
因为我们做的是前后端分离项目 无法采用response.write直接将文件流写出 我们采用阿里云oss 进行保存 再返回的结果对象里面保存我们的文件地址 废话不多说,上代码 Springboot 第 ...
- ASP.NET WebApi+Vue前后端分离之允许启用跨域请求
前言: 这段时间接手了一个新需求,将一个ASP.NET MVC项目改成前后端分离项目.前端使用Vue,后端则是使用ASP.NET WebApi.在搭建完成前后端框架后,进行接口测试时发现了一个前后端分 ...
- Spring-Gateway与Spring-Security在前后端分离项目中的实践
前言 网上貌似webflux这一套的SpringSecurity操作资料貌似很少. 自己研究了一波,记录下来做一点备忘,如果能帮到也在迷惑的人一点点,就更好了. 新项目是前后端分离的项目,前台vue, ...
- 分享我在前后端分离项目中Gitlab-CI的经验
长话短说,今天分享我为前后端分离项目搭建Gitlab CI/CD流程的一些额外经验. Before Gitlab-ci是Gitlab提供的CI/CD特性,结合Gitlab简单友好的配置界面,能愉悦的在 ...
- 《论vue在前后端分离项目中的实践之年终总结》
我是2014年的时候开始了解知道的vue,当时vue还不太成熟,想用但是又怕自己hold不住,况且那时候vue还没有成熟的(路由.验证.ui组件)插件,社区也是不温不火的,再说也没有合适的机遇让我去项 ...
- docker部署angular和asp.net core组成的前后端分离项目
最近使用docker对项目进行了改进,把步骤记录一下,顺便说明一下项目的结构. 项目是前后端分离的项目,后端使用asp.net core 2.2,采用ddd+cqrs架构的分层思想,前端使用的是ang ...
- SpringBoot+Vue前后端分离项目,maven package自动打包整合
起因:看过Dubbo管控台的都知道,人家是个前后端分离的项目,可是一条打包命令能让两个项目整合在一起,我早想这样玩玩了. 1. 建立个maven父项目 next 这个作为父工程,next Finish ...
- 在前后端分离项目中使用SpringBoot集成Shiro
前言 这次在处理一个小项目时用到了前后端分离,服务端使用springboot2.x.权限验证使用了Shiro.前后端分离首先需要解决的是跨域问题,POST接口跨域时会预发送一个OPTIONS请求,浏览 ...
随机推荐
- 【转】IDEA搭建SSM框架(spring+maven+mybatis+mysql+junit)
环境安装: apache-tomcat-9.0 https://tomcat.apache.org/download-90.cgi 配置:https://blog.csdn.net/qq_415706 ...
- 可以编译驱动,编译ch34x驱动后,不能编译驱动了
编译驱动时,得先把内核编译好: 已经成功编译了01驱动: 后来编译ch34x驱动,发现编译不成功: 然后再编译01驱动也不成功了: 再次编译内核,再编译01就能编译了: 能力有限,不知道为什么,记录下 ...
- JavaScript之异步编程
什么是异步 异步:Asynchronous,async是与同步synchronous,sync相对的概念. 传统单线程编程中,程序的运行是同步的,指程序运行在一个控制流之中运行.而异步的概念就是不保证 ...
- Ubuntu 安装 Nginx
Ubuntu版本:20.04.1 LTS Nginx版本:1.22.0 下载地址: https://nginx.org/en/download.html 上传目录:/usr/local/src 安装目 ...
- 在Qt4中添加QSerialPort模块
在Qt5及以上的版本中提供了QSerialPort串口模块,如果想在Qt4版本中使用该模块,可以自行安装,但仅限于5.5以下的QSerialPort版本.下面就以qtserialport-openso ...
- Mybatis-plus中通用mapper的CRUD(增、删、改、查)操作封装BaseMapper和IService(最详细)
使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQL.而且,当数据库表结构改动时,对应的所有SQL以及 ...
- sql语句顺序/包含执行顺序和书写顺序
分页查询 如果一页记录为10条,希望查看第3页记录应该怎么查呢? 第一页记录起始行为0,一共查询10行: 第二页记录起始行为10,一共查询10行: 第三页记录起始行为20,一共查询10行: ...
- 【C学习笔记】day4-1 在屏幕上输出以下图案
1.在屏幕上输出以下图案: * *** ***** ******* ********* *********** ************* *********** ********* ******* ...
- vue+elementUI表格实现自定义右键菜单
组件代码: <template> <div id="contextmenu" class="contextmenu open"> < ...
- C++基础复习题(笔试题)
C++基础~for循环:选择,判断 HELLO,亲爱的小朋友! 我们准备 35个选择题,对for循环及之前的内容进行一个简单的复习,快来看一下吧! 顺序&选择结构 1.对于C++中变量的命名规 ...