用戶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.UseJmsTokenAuthentication("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時間 }; }