.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请求,浏览 ...
随机推荐
- RT-Thread Studio使用——创建工程并配置外部时钟(转)
硬件:正点原子阿波罗F429开发板,主控STM32F429IGT6,晶振25MHz. 软件:RT-Thread Studio RT-Thread版本:4.1.0 1.创建工程 根据所使用的硬件信息,配 ...
- 前端下载图片、pdf、excel、world文件;前端下载图片和pdf文件;前端a标签下载图片和pdf文件;下载文件名称不生效原因
https://blog.csdn.net/i_am_a_div/article/details/125050379 https://blog.csdn.net/moguzhale/article/d ...
- pdf中添加二维码无法扫描解决方案
正常行驶的bitmap类型的二维码格式,加载到PDF中,将会导致二维码失真,无法扫描. 矢量图可根据尺寸大小进行调节,不会出现失真模糊情况 所用依赖 <PackageReference Incl ...
- C++实现顺序队列(循环队列)相关操作代码
#include<iostream>#include<cstdlib>using namespace std;#define MAXSIZE 100#define OK 1#d ...
- vue node Failed at the iview-admin
npm ERR! iview-admin@1.3.1 dev: `webpack-dev-server --content-base ./ --open --inline --hot --compre ...
- go对数组对象排序
1.根据时间对数组对象排序 package main import ( "fmt" "time" "github.com/ah ...
- Visualization: Pie Chart(可视化:饼图)
1 <html> 2 <head> 3 <script type="text/javascript" src="https://www.gs ...
- GPS北斗卫星时钟同步系统提升电信支撑网性能
GPS北斗卫星时钟同步系统提升电信支撑网性能 京准科技提供参考--更多资料VX(ahjzsz) 各项新的数据业务,如电子商务.多媒体通信.IP电话等都是电信业务发展的新增长点,而传统业务也存在多家企业 ...
- IO流(1)
IO流(1) 目录 IO流(1) 文件 创建文件 获取文件信息 目录的操作和文件删除 文件 文件流 文件在程序中以流的形式来操作 输入流:数据从数据源(文件)到程序(内存)的路径 输出流:数据从程序( ...
- 浅写java环境配置
我对于Java环境配置的理解: 下载JDK ==>安装JDK ==>在电脑的系统中添加JDK中所包含的Java环境 ==>重启(主要是给系统监测到环境,非必要,但是建议)==> ...