微信号:iDotNet

介绍:专注分享 .NET 相关技术文章、教程和工具.有时也会涉及到IT职场相关的一些东西,或者来点幽默趣文.

深入浅出 ASP.NET Core 基于JWT的认证和授权

2018-11-20 11:45 DotNet

(给DotNet加星标,提升.Net技能


转自:张飞洪

cnblogs.com/jackyfei/p/9961099.html


Cookie-Based认证


认证流程


我们先看下传统Web端的认证流程:



以上流程很简单,有过mvc开发经验的都了如指掌,一图胜千言就不展开介绍了,下面简单演示一下实现:


编码实现


首先我们新建一个mvc项目



我们在AdminController.cs里增加[Authorize]



在Startup.cs中



这时候我们访问https://localhost:5001/Admin/Index后台会跳转到Account/Login



所以我们要先登陆一下:https://localhost:5001/account/login,模拟登陆,最后再访问Admin/Index就成功了,如下图:



整个过程,我录个视频看下:



JWT认证


简介和使用场景


Cookie-Based认证不是我们这篇文章的重点,接下来我们来看下JWT(JSON Web Token)认证,关于这个认证网上资料也非常多。


有篇不错的文章参考《用JWT来保护我们的ASP.NET Core Web API》,这里还有一个JWT的官网(https://jwt.io/)值得关注和简书是的参考。


相对以往的文章,我会吸其精华整理后变成我系列的一部分,我知道重复是危险的,但是不去整理,似乎离系统化还是有那么一点点距离。


所以我写的这篇不是重复造轮子,我会尽可能站在您的角度,考虑阅读的舒服性,理解的便捷性。也许你会觉得简单粗暴,一看就懂,那就有那么点意义。


其实我觉得技术文章其实也可以不用长篇大论,重点是要能把简单的道理用深入浅出的方式让大家快速接受。


JWT一般用在基于RESTful API的移动端、Web端、其他端等多个终端的联合认证。和Cookie-Based认证最大的不同是,他不需要手动来重定向,API只返回标准的HTTP Code,具体有哪些Code,我们可以查看阮一峰大哥的RESTful API设计指南和RESTful API最佳实践。这里扯远了,我们看下图流程,基本就知道JWT的机制了。



关于JWT我们掌握它的Header、Payload、Signature三段部分就差不多了,如下图所示:



我们看到左边的Token的是怎么来的,右边的SIGNATURE经过多重加密进行拼接,其中HEADER和PAYLOAD进行了BASE64位加密,然后+256位的Secret,外层再用SHA256进行加密。 


编码实现


接下来我们编码来实现这个认证:


1)  首先我们新建JSON配置和对应的实体映射。



2) 在Starup.cs当中,我们需要引入类库


using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;


3) 同时在Starup.cs中,通过Bind方法进行配置和实体的绑定,然后配置JWT相关参数。如下图所示:



4) 最后别忘记配置权限管道



5)我们再看看加和不加Authorize的浏览器返回的区别,如下图所示:



以上代码大部分是截图,截图看起来更加顺眼,虽然不方便复制,如果你想看完整代码可以访问我的GitHub地址(https://github.com/zfeihong/jackyfei)


推荐阅读

(点击标题可跳转阅读)

【实战】.NET Core API 框架实现接口的JWT授权验证

.NET使用Jwt、OpenID Connect实现基于OAuth的身份验证

ASP.NET Core 2.1 中使用jwt从原理到精通


看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

 
DotNet 更多文章 C# 爬虫爬取商品信息 .NET Core 开发日志配置 .NET Core 中基于Generic Host来实现后台任务 VS Code 1.29 发布,众多新功能有没有你想要的? ASP.NET Core 的用户注册功能:Identity上手
猜您喜欢 看看这11个好用的移动应用设计教程 摩拜女工程师实名举报领导性骚扰!被举报人已停职 mongodb运维之副本集实践 过去这一年,刷爆美国朋友圈的高科技发明TOP 20 Matt Dowle 演讲节选(一)