AntDesign Pro + .NET Core 实现基于JWT的登录认证

很多同学说AgileConfig的UI实在是太丑了。我想想也是的,本来这个项目是我自己使用的,一开始甚至连UI都没有,全靠手动在数据库里修改数据。后来加上了UI也是使用了老掉牙的bootstrap3做为基础样式。前台框架也是使用了angularjs,同样是老掉牙的东西。过年期间终于下决心翻新AgileConfig的前端UI。最后选择的前端UI框架为AntDesign Pro + React。至于为啥选Ant-Design Pro是因为他好看,而且流行,选择React是因为VUE跟Angular我都略知一二,干脆趁此机会学一学React为何物,为何这么流行。
登录的认证方案为JWT,其实本人对JWT不太感冒(请看这里《我们真的需要JWT吗?》),无奈大家都喜欢,那我也只能随大流了。
其实基于ant-design pro的界面我已经翻的差不多了,因为它支持mock数据,所以我一行后台代码都没修改,已经把界面快写完了。从现在开始要真正的跟后端代码进行联调了。那么我们先从登录开始吧。先看看后端asp.net core方面会如何进行修改。

修改ASP.NET Core后端代码

  "JwtSetting": {"SecurityKey": "xxxxxxxxxxxx", // 密钥"Issuer": "agileconfig.admin", // 颁发者"Audience": "agileconfig.admin", // 接收者"ExpireSeconds": 20 // 过期时间 s}

在appsettings.json文件添加jwt相关配置。

  public class JwtSetting{static JwtSetting(){Instance = new JwtSetting();Instance.Audience = Global.Config["JwtSetting:Audience"];Instance.SecurityKey = Global.Config["JwtSetting:SecurityKey"];Instance.Issuer = Global.Config["JwtSetting:Issuer"];Instance.ExpireSeconds = int.Parse(Global.Config["JwtSetting:ExpireSeconds"]);}public string SecurityKey { get; set; }public string Issuer { get; set; }public string Audience { get; set; }public int ExpireSeconds { get; set; }public static JwtSetting Instance{get;}}

定义一个JwtSetting类,用来读取配置。

        public void ConfigureServices(IServiceCollection services){services.AddMemoryCache();services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>{options.TokenValidationParameters = new TokenValidationParameters{ValidIssuer = JwtSetting.Instance.Issuer,ValidAudience = JwtSetting.Instance.Audience,IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(JwtSetting.Instance.SecurityKey)),};});services.AddCors();services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0).AddRazorRuntimeCompilation();services.AddFreeSqlDbContext();services.AddBusinessServices();services.AddAntiforgery(o => o.SuppressXFrameOptionsHeader = true);}

修改Startup文件的ConfigureServices方法,修改认证Scheme为JwtBearerDefaults.AuthenticationScheme,在AddJwtBearer方法内配置jwt相关配置信息。因为前后端分离项目所以有可能api跟ui部署在不同的域名下,所以开启Cors。

     // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseMiddleware<ExceptionHandlerMiddleware>();}app.UseCors(op=> {op.AllowAnyOrigin();op.AllowAnyMethod();op.AllowAnyHeader();});app.UseWebSockets(new WebSocketOptions(){KeepAliveInterval = TimeSpan.FromSeconds(60),ReceiveBufferSize = 2 * 1024});app.UseMiddleware<WebsocketHandlerMiddleware>();app.UseStaticFiles();app.UseRouting();app.UseAuthentication();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapDefaultControllerRoute();});}

修改Startup的Configure方法,配置Cors为Any。

    public class JWT{public static string GetToken(){//创建用户身份标识,可按需要添加更多信息var claims = new Claim[]{new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),new Claim("id", "admin", ClaimValueTypes.String), // 用户idnew Claim("name", "admin"), // 用户名new Claim("admin", true.ToString() ,ClaimValueTypes.Boolean) // 是否是管理员};var key = Encoding.UTF8.GetBytes(JwtSetting.Instance.SecurityKey);//创建令牌var token = new JwtSecurityToken(issuer: JwtSetting.Instance.Issuer,audience: JwtSetting.Instance.Audience,signingCredentials: new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature),claims: claims,notBefore: DateTime.Now,expires: DateTime.Now.AddSeconds(JwtSetting.Instance.ExpireSeconds));string jwtToken = new JwtSecurityTokenHandler().WriteToken(token);return jwtToken;}}

添加一个JWT静态类用来生成jwt的token。因为agileconfig的用户只有admin一个所以这里用户名,ID都直接写死。

 [HttpPost("admin/jwt/login")]public async Task<IActionResult> Login4AntdPro([FromBody] LoginVM model){string password = model.password;if (string.IsNullOrEmpty(password)){return Json(new{status = "error",message = "密码不能为空"});}var result = await _settingService.ValidateAdminPassword(password);if (result){var jwt = JWT.GetToken();return Json(new { status="ok",token=jwt,type= "Bearer",currentAuthority = "admin"});}return Json(new{status = "error",message = "密码错误"});}

新增一个Action方法做为登录的入口。在这里验证完密码后生成token,并且返回到前端。
到这里.net core这边后端代码改动的差不多了。主要是添加jwt相关的东西,这些内容网上已经写了很多了,不在赘述。
下面开始修改前端代码。

修改AntDesign Pro的代码

AntDesign Pro已经为我们生成好了登录页面,登录的逻辑等,但是原来的登录是假的,也不支持jwt token做为登录凭证,下面我们要修改多个文件来完善这个登录。

export function setToken(token:string): void {localStorage.setItem('token', token);
}
export function getToken(): string {var tk = localStorage.getItem('token');if (tk) {return tk as string;}return '';
}

在utils/authority.ts文件内新增2个方法,用来存储跟获取token。我们的jwt token存储在localStorage里。

/** 配置request请求时的默认参数 */
const request = extend({prefix: 'http://localhost:5000',errorHandler, // 默认错误处理credentials: 'same-origin', // 默认请求是否带上cookie,headers: {Authorization: 'Bearer '+getToken(),},
});

修改utils/request.ts文件,在extend方法内添加jwt认证的头部Authorization为我们的token。
设置prefix为http://localhost:5000这是我们的后端api的服务地址,真正生产的时候会替换为正式地址。
设置credentials为same-origin。

export async function accountLogin(params: LoginParamsType) {return request('/admin/jwt/login', {method: 'POST',data: params,});
}

在services/login.ts文件内新增发起登录请求的方法。

 effects: {*login({ payload }, { call, put }) {const response = yield call(accountLogin, payload);yield put({type: 'changeLoginStatus',payload: response,});// Login successfullyif (response.status === 'ok') {const urlParams = new URL(window.location.href);const params = getPageQuery();message.success('???? ???? ????  登录成功!');let { redirect } = params as { redirect: string };if (redirect) {console.log('redirect url ' , redirect);const redirectUrlParams = new URL(redirect);if (redirectUrlParams.origin === urlParams.origin) {redirect = redirect.substr(urlParams.origin.length);if (redirect.match(/^\/.*#/)) {redirect = redirect.substr(redirect.indexOf('#') + 1);}} else {window.location.href = '/';return;}}history.replace(redirect || '/');}},reducers: {changeLoginStatus(state, { payload }) {setAuthority(payload.currentAuthority);setToken(payload.token)return {...state,status: payload.status,type: payload.type,};},},

修改models/login.ts文件,修改effects的login方法,在内部替换原来的fakeAccountLogin为accountLogin。同时修改reducers内部的changeLoginStatus方法,添加setToken的代码,这有修改后登录成功后token就会被存储起来。

  effects: {*fetch(_, { call, put }) {const response = yield call(queryUsers);yield put({type: 'save',payload: response,});},*fetchCurrent(_, { call, put }) {const response = {name: '管理员',userid: 'admin'};yield put({type: 'saveCurrentUser',payload: response,});},},

修改models/user.ts文件,修改effects的fetchCurrent方法为直接返回response。本来fetchCurrent是会去后台拉当前用户信息的,因为agileconfig的用户就admin一个,所以我直接写死了。

让我们试一下登录吧:)
源码在这:https://github.com/kklldog/AgileConfig/tree/react_ui ????????????

关注我的公众号一起玩转技术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

武汉大学计算机学院2019考研复试,2019年武汉大学硕士研究生复试及录取名单汇总...

原标题&#xff1a;2019年武汉大学硕士研究生复试及录取名单汇总考生可以通过录取名单了解到很多重要的信息&#xff0c;例如复试比例&#xff0c;进复试最低分&#xff0c;复试录取成绩&#xff0c;录取总评成绩等重要信息。以下是我们整理收集到的各学院复试录取名单汇总&…

ugui unity 取消选择_UGUI中几种不规则按钮的实现方式

前言UGUI中的按钮默认是矩形的&#xff0c;若要实现非矩形按钮该怎么做呢&#xff1f;比如这样的按钮&#xff1a;本文将介绍两种实现方式供大家选择。使用alphaHitTestMinimumThresholdImage类的alphaHitTestMinimumThreshold是一个浮点值&#xff0c;Raycast检测时只有图片中…

你的专业 VS 你妈口中你的专业

亲妈认证★英语语言文学我妈&#xff1a;她就是一个学英语的~我同学&#xff1a;你学英语的啊&#xff1f;那你看美剧不用看字幕的吧&#xff1f;你听英文歌都听得懂的吧&#xff1f;这个怎么翻译啊&#xff1f;这上面写的什么&#xff1f;你不是专八吗&#xff1f;哈喽~ 在吗&…

反射 + 抽象工厂模式切换不同的实现方法

概述工厂模式&#xff08;Abstract Factory&#xff09;定义 &#xff1a;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是围绕一个超级工厂创建其他工厂。该超级工厂又称为其…

3 年工作经验程序员应有的技能

前言因为和同事有约定再加上LZ自己也喜欢做完一件事之后进行总结&#xff0c;因此有了这篇文章。这篇文章大部分内容都是面向整个程序员群体的&#xff0c;当然因为LZ本身是做Java开发的&#xff0c;因此有一部分内容也是专门面向咱们Java程序员的。第二阶段&#xff1a;五年五…

应急响应中的溯源方法

在发现有入侵者后&#xff0c;快速由守转攻&#xff0c;进行精准地溯源反制&#xff0c;收集攻击路径和攻击者身份信息&#xff0c;勾勒出完整的攻击者画像。 对内溯源与对内溯源 对内溯源&#xff1a;确认攻击者的行为 &#xff0c;分析日志 数据包等&#xff1b; 对外溯源&…

POP3口令扫描案例

通过本案例可以学到&#xff1a; (1)了解POP3有关知识(2)利用Hscan工具软件来破解POP3账号和口令现在很多邮箱服务器都支持POP3功能&#xff0c;通过POP3来收取信件&#xff0c;收取信件时仅仅需要提供用户名和密码。目前有很多工具可以扫描POP3邮件账号和口令&#xff0c;本案…

中connect怎么用_烘焙中的各种酒,到底该怎么用?

​在烘焙食谱中&#xff0c;经常会出现“酒”这样材料。烘焙中的酒&#xff0c;仿佛是个神秘的存在&#xff0c;品种也繁多得让人一脸懵逼&#xff0c;朗姆酒是干嘛用的&#xff1f;怎么还有分白朗姆和金朗姆&#xff1f;和利口酒有什么区别&#xff1f;利口酒和力娇酒是同一个…

QQ旋风爆缓冲区溢出漏洞

据金山毒霸安全实验室5月7日透露&#xff0c;金山毒霸安全实验室研究人员进行例行漏洞检查过程中&#xff0c;发现QQ旋风存在一鲜为人知的缓冲区溢出0day漏洞&#xff0c;***者可以利用该漏洞制造恶意URL&#xff0c;使用IE6&#xff0c;7内核的各种浏览器均会受此漏洞的影响。…

w10计算机无法打印,win10升级后惠普无法打印怎么解决_win10升级后惠普打印不了的处理办法...

使用电脑工作或学习时&#xff0c;我们经常会需要用到打印机。可是最近有一些网友却反映说&#xff0c;自己的win10电脑在升级后出现了惠普无法打印的情况&#xff0c;这是怎么一回事呢&#xff1f;我们又该怎么解决呢&#xff1f;用户不是很清楚&#xff0c;所以对此今天本文为…

女神节爆猛料!. NET程序员男女比例公布!

今天是三八女神节&#xff0c;这里先祝广大的程序员妹子们节日快乐&#xff0c;健康美丽&#xff01;有一个问题&#xff0c;相信很多.NET程序员都很感兴趣&#xff1a;.NET程序员中女生占比多少&#xff1f;先来公布答案&#xff1a;在本次调查中发现&#xff0c;.NET程序员群…

金蝶凭证序时簿在哪_来了!金蝶日常账务处理大全

上一期给宝宝们更新了金蝶软件建账的一些处理流程&#xff0c;宝宝们已经迫不及待要求后续了。在日常处理部分主要是以下几个方面一、凭证审核1.凭证录入点击主窗口中的【凭证】&#xff0c;单击【凭证】录入在凭证录入窗口中单击【凭证录入】按钮&#xff0c;在这个窗口中就可…

在C#中使用SQLite

SQLite 是一个嵌入式的关系数据库系统&#xff0c;使用十分广泛。在一些数据量不大的应用程序中&#xff0c;如果使用SQLite可以极大的减少部署时的工作量。 要在C#中使用SQLite也很简单&#xff0c;只要找一个C#的wrapper就可以了&#xff0c;例如&#xff0c;我使用的就是来自…

BI 界震动 - Power BI Premium 个人版只要每月 120 元

大事来了就在今天&#xff0c;微软宣布&#xff1a;Power BI Premium Per User 定价&#xff1a;每月 120 元人民币。我只能说&#xff1a;他没有骗人。Power BI 团队也在这个战略决策上符合了微软的核心使命。这一举措将更加彻底的巩固微软 Power BI 的商业智能帝国地位&#…

用 Python 实现一个大数据搜索引擎

搜索是大数据领域里常见的需求。Splunk和ELK分别是该领域在非开源和开源领域里的领导者。本文利用很少的Python代码实现了一个基本的数据搜索功能&#xff0c;试图让大家理解大数据搜索的基本原理。布隆过滤器 &#xff08;Bloom Filter&#xff09;第一步我们先要实现一个布隆…

iNeuOS工业互联操作系统,图表与数据点组合成新组件,进行项目复用

目 录1. 概述... 12. 演示信息... 23. 应用过程... 21. 概述针对有些行业的数据已经形成了标准化的建模或者有些公司专注于某个领域&#xff0c;对于开发业务有很多情况需求进行复用&#xff0c;以前的版本和文章介绍了图元及数据点的组合形成新的图元进…

通过对象属性去重_Redis常见对象类型的底层数据结构

作者&#xff1a;伍陆七来源&#xff1a;cnblogs.com/chentianming/p/13838347.htmlRedis 是一个基于内存中的数据结构存储系统&#xff0c;可以用作数据库、缓存和消息中间件。Redis 支持五种常见对象类型&#xff1a;字符串(String)、哈希(Hash)、列表(List)、集合(Set)以及有…

按照演算,整个宇宙将会陷入无边的黑暗

导读&#xff1a;能量守恒定律告诉我们&#xff1a;能量既不会凭空产生&#xff0c;也不会凭空消失&#xff0c;它只会从一种形式转化为另一种形式&#xff0c;或者从一个物体转移到其它物体&#xff0c;而能量的总量保持不变。熵作为只增不减的物质&#xff0c;该怎么去理解它…

xp计算机启动检测硬盘,取消WinXP开机自检技巧五则

有时我们正常关闭计算机后&#xff0c;再次开机时发现系统会出现自行检测&#xff0c;这让许多XP用户们感到不方便&#xff0c;那么该怎么取消XP开机自检呢&#xff1f;下面就是具体的方法了&#xff0c;一起来看看吧。方法①&#xff1a;假如分区是FAT32格式&#xff0c;将其转…

10 邮件槽_员工主动发离职邮件,提出申请又反悔,法院判决让人懵了!

前言&#xff1a;很多职场人从来不把劳动法当作一项技能&#xff0c;一遇到事&#xff0c;瞬间就傻。还有部分职场人&#xff0c;什么事都不做&#xff0c;只会说劳动法没有用。就笔者认识的一部分大厂员工&#xff0c;他们现在已经把每天视频打卡跟录音取证作为一项日常工作来…