JWT(Json Web Token)实现了一种便捷的身份认证方案,我们可以在它的payload中携带一些信息, 例如登录用户的id,角色等信息, 如果这些信息被篡改了,除非对方破解的签发token的securitykey,否则系统在认证身份时是不会通过的,因此可以保证信息的真实性。
那么在webapi中怎样使用这些信息呢?
首先,token是携带在Request Header里的:
string authHeader = this.HttpContext.Request.Headers["Authorization"];
获取到的authHeader的内容是由一个DefaultAuthenticateScheme和token拼接成的,这个DefaultAuthenticateScheme由startup.cs里配置:
services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; })
这里使用default值的话,是“Bearer ”。把“Bearer ”替换掉以后,获取到的就是token。
然后对token进行解析:
string tokenStr = authHeader.Replace("Bearer ", "");
var handler = new JwtSecurityTokenHandler();
var payload = handler.ReadJwtToken(tokenStr).Payload;
var claims = payload.Claims;
JwtSecurityTokenHandler()的命名空间为:
using System.IdentityModel.Tokens.Jwt;
最后获取到的claims的类型为IEnumerable<Claim>,根据签发token时设置的内容,就可以读取payload里的信息了:
var userid = claims.First(claim => claim.Type == "userId").Value;