JWT由三部分组成: header, payload, signature. 形式如下面的伪代码: [X=base64(header)].[Y=base64(payload)].[signature([X].[Y])] .
去这个网址可以更直观的理解这三部分: jwt.io
JWT token最终是一个字符串, 它的三个部分用点(.)分开, 前两部分(header payload)是Base64编码的字符串; 最后一部分是前两个Base64字符串的组合, 也是用点(.)分开并进行了签名, 如下图:
使用Bearer方案和JWT的流程如下:
配置项目, 在Startup的ConfigureServices里:
如果使用Identity Server 4的话, 这里就可以不这样写了.
首先我们配置使用Bearer认证方案, 然后通过AddJwtBearer设定一些参数. Configuration里面的值可以放在appSettings.json里面或者其它地方:
然后在Configure方法里调用app.UseAuthentication()方法, 要在app.UseMvc()之前调用:
最后使用[Authorize]属性标签把CountryController保护起来, 也可以应用于Action级:
发送不带Authorization Header的请求来测试:
返回 401 Unauthorized 未授权.
返回的Header里面告诉我们应该使用Bearer认证方案.
下面我们需要一个可以生成JWT token的节点, 针对本文我就在本项目里建立这个节点吧:
请求token的地址是 /api/authentication, 请求token用的是Basic方案, Post方法里就是先解码, 验证用户名和密码, 成功后调用GenerateToken生成token.
那就按要求再次发送请求:
注意这里usename:password的base64编码是: dXNlcm5hbWU6cGFzc3dvcmQ=
现在我获得了token, 然后我用token再次请求Country资源:
资源就可以正常的访问了.
想要解析这个token, 需要到jwt.io:
箭头处需要填上secret.
这个例子比较简单, 实际应用中还是使用Identity Server 4之类的东西吧.
使用HTTPS
根据官方文档(), 它建议ASP.NET Core web应用都应该调用HTTPS重定向中间件, 这样就可以把所有的HTTP请求转换为HTTPS.
只需要在Startup的Configure方法里调用UseHttpsRedirection()方法即可:
而在ConfigureServices方法里可以配置这个中间件: