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令牌应用的更多相关文章

  1. 喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了

    折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...

  2. 两个开源的 Spring Boot + Vue 前后端分离项目

    折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...

  3. Springboot+vue前后端分离项目,poi导出excel提供用户下载的解决方案

    因为我们做的是前后端分离项目 无法采用response.write直接将文件流写出 我们采用阿里云oss 进行保存 再返回的结果对象里面保存我们的文件地址 废话不多说,上代码 Springboot 第 ...

  4. ASP.NET WebApi+Vue前后端分离之允许启用跨域请求

    前言: 这段时间接手了一个新需求,将一个ASP.NET MVC项目改成前后端分离项目.前端使用Vue,后端则是使用ASP.NET WebApi.在搭建完成前后端框架后,进行接口测试时发现了一个前后端分 ...

  5. Spring-Gateway与Spring-Security在前后端分离项目中的实践

    前言 网上貌似webflux这一套的SpringSecurity操作资料貌似很少. 自己研究了一波,记录下来做一点备忘,如果能帮到也在迷惑的人一点点,就更好了. 新项目是前后端分离的项目,前台vue, ...

  6. 分享我在前后端分离项目中Gitlab-CI的经验

    长话短说,今天分享我为前后端分离项目搭建Gitlab CI/CD流程的一些额外经验. Before Gitlab-ci是Gitlab提供的CI/CD特性,结合Gitlab简单友好的配置界面,能愉悦的在 ...

  7. 《论vue在前后端分离项目中的实践之年终总结》

    我是2014年的时候开始了解知道的vue,当时vue还不太成熟,想用但是又怕自己hold不住,况且那时候vue还没有成熟的(路由.验证.ui组件)插件,社区也是不温不火的,再说也没有合适的机遇让我去项 ...

  8. docker部署angular和asp.net core组成的前后端分离项目

    最近使用docker对项目进行了改进,把步骤记录一下,顺便说明一下项目的结构. 项目是前后端分离的项目,后端使用asp.net core 2.2,采用ddd+cqrs架构的分层思想,前端使用的是ang ...

  9. SpringBoot+Vue前后端分离项目,maven package自动打包整合

    起因:看过Dubbo管控台的都知道,人家是个前后端分离的项目,可是一条打包命令能让两个项目整合在一起,我早想这样玩玩了. 1. 建立个maven父项目 next 这个作为父工程,next Finish ...

  10. 在前后端分离项目中使用SpringBoot集成Shiro

    前言 这次在处理一个小项目时用到了前后端分离,服务端使用springboot2.x.权限验证使用了Shiro.前后端分离首先需要解决的是跨域问题,POST接口跨域时会预发送一个OPTIONS请求,浏览 ...

随机推荐

  1. Golang如何快速构建一个CLI小工示例

    这篇文章主要为大家介绍了Golang如何快速构建一个CLI小工具详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪 如何Golang快速构建一个CLI小工具 在现实开发的 ...

  2. pip 基本问题

    pip语法错误 pip换源 更新错误 无模板 Ignoring警告 问题一 (pip语法错误 ) pip list File "<stdin>", line 1 pip ...

  3. mysql 服务安装与配置

    数据库服务下载与安装: 下载地址:MySQL Community Server 安装:跟随引导一路下一步,建议配置root密码,不然安装成功cmd验证却是要求密码.没有密码还需要执行命令重新设置密码, ...

  4. Python 20个常用库

    Requests.Kenneth Reitz写的最富盛名的http库.每个Python程序员都应该有它. Scrapy.如果你从事爬虫相关的工作,那么这个库也是必不可少的.用过它之后你就不会再想用别的 ...

  5. Windows10使用VMware安装centos

    系统环境: Windows 10 安装步骤: 1.下载centos http://mirrors.aliyun.com/centos/ 2.使用VMware安装centos 3.配置网络 $ cd / ...

  6. Using ML.NET in Jupyter notebooks 在jupyter notebook中使用ML.NET ——No design time or full build available

    题外话:标题直接用了微软开发博客的标题.近期需要调研一个项目的可行性,github上有个相似度很高的方案,但项目是写在jupyter里的C#代码.为了能跑起来看看效果,不得已搭了套相关的环境.本来以为 ...

  7. pgsql判断字符串是否为数字

    利用正则表达式来对字符串进行匹配 因为工作遇到了一个问题需要对字符串是否可以转换为数值进行判断.今天关于这个问题进行一个分享,流程如下 数字的正则表达式 ^([0-9]+.?[0-9]*|.[0-9] ...

  8. js网页禁止右键下载代码

    <script type="text/javascript"> //禁用右键 document.onkeydown = function() { var e = win ...

  9. SpringCloudBus实现配置文件动态更新

    前言 在SpringCloud之配置中心(config)的使用的基础上加上SpringCloudBus实现配置文件动态更新 在此之前需要修改版本,否则会出现"Endpoint ID 'bus ...

  10. page-break-after:always 打印分页

    在实现打印功能时候,可以完整分页,需要配合二维数组来使用,避免下一页数据展示到上一页