JMS微服务开发示例(五)生成短token,实现用户无状态登录
用户token,也可以利用第三方框架生成,JMS也包含了自己的token服务器。
部署TokenServer
到这里下载 tokenserver.zip,然后部署运行TokenServer。
微服务中编写Login函数
引用 JMS.Token nuget包
代码如下:
public class MyController : MicroServiceControllerBase
{
TokenClient _tokenClient;
public MyController(TokenClient tokenClient)
{
this._tokenClient = tokenClient;
}
/// <summary> /// 登陆系统 /// </summary> /// <param name="userName">用户名</param> /// <param name="password">密码</param> /// <returns>用户token</returns> public string Login(string userName,string password) { //假设用户登陆成功,id为888 var userid = "888";var token = _tokenClient.Build(userid, DateTime.Now.AddMinutes(15));
return token; } /// <summary> /// 刷新token /// </summary> /// <returns>新的用户token</returns> [JMS.Authorize]
public string RefreshToken()
{
var token = _tokenClient.Build(this.UserContent, DateTime.Now.AddMinutes(15));
return token;
}
//下面代码,可作废token,这样,所有服务器都会不再认同这个token
//_tokenClient.SetTokenDisable(token);
}
Program.cs中,启用JMS.Token作为身份验证
services.AddJmsTokenAuthentication("192.168.40.132", 9911,"auth");
服务器端作废token
_tokenClient.SetTokenDisable(token);
Controller中,如果所有方法要求身份验证,才能调用,那么,在Controller上加上 [JMS.Authorize] 标识,如果只是某些方法要求身份验证,那么,在方法上加 [JMS.Authorize] 标识
上面代码展示了如何生成一个最短的token,如果你想在token里面放更多的信息,可以使用TokenClient.BuildForString函数生成。不过,有userid和过期时间足矣了,因为token需要每次都放在头部传输,太长只会增加网络流量。
客户端访问微服务时,把token放在header里面
using ( var tran = CreateMST() ) { tran.SetHeader("auth", token); .......
AspNet中使用JMS.Token验证
nuget 引用 JMS.Token.AspNetCore
public void ConfigureServices(IServiceCollection services) { services.AddJmsTokenAuthentication("127.0.0.1", 9911); services.AddControllers(); }
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); //启用身份验证 app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
Controller中获取身份信息:[Authorize]为标准的AspNet [Authorize],不是JMS.Authorize
客户端js请求,加上Authorization头,如:Authorization:your token,注意,不要加
下面代码是服务器端获取token用户信息
[Authorize] [HttpGet] public string Test() { return this.User.FindFirstValue("Content"); }
JS端token解码,获取过期时间
//解码string类型的token function decodeJmsStringToken(token) { var str = window.atob(token); var strArr = JSON.parse(str); var obj = JSON.parse(strArr[0]); var expireTime = new Date(new Date(1970, 0, 1).getTime() + obj.e * 1000); return { content: obj.d, expireTime: expireTime //utc时间 }; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)