本文开始学习基于JWT的身份认证基本用法,相比Cookie、Session等方式,JWT要复杂一些,除了注册认证服务之外,还需提供JWT Token的生成函数或生成类,以便在访问需授权的函数之前获取Token。参考文献1-7中大部分示例都是基于WebApi项目,本文基于Microsoft.AspNetCore. Authentication. JwtBearer包,参照参考文献中的代码,实现最简单的JWT身份认证,由于还不清楚客户端如何保存并传递JWT Token到服务端,暂时使用postman访问WebApi,先不管参数设置是否正确或合适,能调通就可以,后续再逐步学习各种参数的意义及用法。
新建WebApi项目,在Nuget包管理器中搜索并安装Microsoft.AspNetCore. Authentication. JwtBearer包。
在appsettings.json中增加JWT设置(这步是抄的参考文献4中的设置),主要是密钥及过期时间(不过测试时发现过期时间没有生效,暂时不清楚是什么地方设置的问题),简单点其实可以直接写死到代码里面,不过既然是照搬,就搬的到位一些。
"JWT": { "Key": "asfasfdflj134aanjkdsjiio1232sdasdfdfkandsf12","expres": "3","Issuer": "gc_2299","Audience": "gc_2299"
}
创建JWT Token的函数也是抄的参考文献4,不过没有单独创建类,而是将其放在了WebApi的控制器类中,设置了允许匿名访问,代码就不贴了,主要是调用JwtSecurityTokenHandler类使用密钥针对claims实例生成Token。
接着是在program.cs文件中添加JwtBear认证服务,这里是抄的参考文献5中的代码,最初测试时使用的是参考文献4的代码,但是测试时始终认证不通过,搞不清楚怎么回事(最后发现是把UseAuthentication和UseAuthorization的顺序搞反了),就换成了参考文献5中的代码,同时将TokenValidationParameters的部分验证参数值调整成了false,最终使用postman调用WebApi函数成功。
builder.Services.AddAuthentication(options =>
{options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{options.TokenValidationParameters = new TokenValidationParameters{ValidateAudience = false,ValidateLifetime = true,ValidateIssuer = false,ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(JwtOtp.Key))};
});
然后就是将需要访问控制的函数或类标识Authorize特性,本文测试时设置GetInfo函数需要访问控制。
打开postman,输入GetInfo地址,直接访问的话会报401未授权错误,如下图所示:
在postman中输入获取Token的地址,获取token,如下图所示:
照下图所示,将Token放在Headers中,key为Authorization,值的话是Bearer+空格+Token,然后再调用GetInfo函数即可正常返回数据。
上述测试内容虽然最终结果是能调用成功,但还不清楚其中有多少使用错误或设置错误的地方,后续还会继续学习并测试Jwt身份认证的相关内容。
参考文献:
[1]https://www.jianshu.com/p/a2804e72d296
[2]https://blog.csdn.net/sD7O95O/article/details/85043160
[3]https://www.cnblogs.com/qiongkangle/p/13347283.html
[4]https://www.cnblogs.com/xbhp/p/17401507.html
[5]https://www.cnblogs.com/superstar/p/16491428.html
[6]https://blog.csdn.net/weixin_44877917/article/details/140609294
[7]https://blog.csdn.net/qq_40287041/article/details/143368882
[8]https://blog.csdn.net/Tdh5258/article/details/119064695