ASP.NET OAuth、jwt、OpenID Connect
2018-01-25 18:51
393 查看
ASP.NET OAuth、jwt、OpenID Connect
上一篇文章介绍了OAuth2.0以及如何使用.Net来实现基于OAuth的身份验证,本文是对上一篇文章的补充,主要是介绍OAuth与Jwt以及OpenID Connect之间的关系与区别。本文主要内容有:
● Jwt简介
● .Net的Jwt实现
● OAuth与Jwt
● .Net中使用Jwt Bearer Token实现OAuth身份验证
● OAuth与OpenID Connect
注:本章内容源码下载:https://files.cnblogs.com/files/selimsong/OAuth2Demo_jwt.zip
Jwt简介
Jwt(Json Web Token)它是一种基于Json用于安全的信息传输标准,Jwt具有以下几个特点:● 紧凑:Jwt由于是为Web准备的,所以就需要让数据尽可能小,能够在Url、Post参数或者Http Header中携带Jwt,同时由于数据小,所以也增加了数据传输的速度。
● 自包含:在Jwt的playload部分包含了所有应该包含的信息,特别是在Jwt用于身份验证时playload中包含了用户必要的身份信息(注:不应该包含敏感信息),这样在进行身份验证时就无需去数据库中查询用户信息。
● 可信:Jwt是带有数字签名的,可以知道Jwt在传输过程中是否被篡改,保证数据是完整的,可用的签名算法有RS256(RSA+SHA-256)、HS256(HMAC+SHA-256)等。
Jwt有两个用途,其一是用于数据交互,因为Jwt是被签名的,可以保证数据的完整性。另外就是用来携带用户信息进行身份验证。
Jwt包含三个部分:
● Header:包含了签名算法以及令牌类型(默认为JWT)。如:
View Code
上面代码做了以下几件事:
● 从AuthenticationTicket中获取Audience信息(注:AuthenticationTicket是.Net中用来保存用户信息的对象,它除了用户信息,如用户名以及用户Claims之外还携带了身份验证的有效期等附加信息,见下图。AuthenticationTicket的创建方式有两种,其一是登录时,在判断登录信息无误后,从数据库中获取相应的用户信息以及从配置(或者默认)获取身份验证信息,如有效期等。另外就是通过反序列化身份Token获取。这里的Protect方法实际上就是序列化Token的方法,所以它得到的AuthenticationTicket是通过第一总方式创建的)
● 创建用于数字签名的SignatureCredentials对象,该对象代表了用于数字签名的算法及其密钥,创建该对象的原因仅仅是JwtSecurityToken对象需要它来完成Token创建。
● 通过JwtSecurityToken对象创建Token,该对象的创建需要发布者(issuer)、观众(audience)、用户Claims信息、发布时间、有效期以及数字签名需要的算法及密钥等。
● 通过JwtSecurityTokenHandler完成对Token的序列化。
3. 在AuthenticationTicket中加入Audience信息。
上面在创建Token时提到了需要Audience信息,而Token是通过AuthenticationTicket创建的,所以需要在创建AuthenticationTicket时加入Audience信息,另外上面也提到AuthenticationTicket的两种创建方法,这里使用的方法就是在“登录”时创建的,而OAuth的“登录”是通过不同类型的“授权”方式实现的,所以要加入Audience信息,只需要在相应方式的授权代码中添加即可(以基于用户名、密码的模式为例,其它方法复制代码即可):
4. 为Audience(Client)添加用于解析Token的JwtBearerAuthentication中间件:
Audience或者说Client包含了受限制的资源,当要访问这些资源时就需要解析Token完成身份验证。而Audience之间或者是Client之间是相对独立的,所以它应该限制可访问的Audience以及拥有自己的加密密钥,甚至还需要验证发布者以确定token的安全性。(注:本例将身份验证服务器和Client都包含在同一个应用中,实际应用可将其分开,这样就是一个简单的单点登录系统)。
5. 运行程序
使用该Token能够正常访问受限资源:
下面是将Token Base64解码后的结果,可以看到Jwt包含的信息:
如果使用test2这个Client获取的Token,将无法访问test1保护的资源:
身份验证失败,跳转登录页面:
OAuth与OpenID Connect
OAuth与OpenID Connect是经常一起出现的两个名词,前者在本系列文章中已经进行过介绍,OAuth是一个授权协议,但是有点矛盾的就是身份验证和授权实际上是两个概念,前面文章也提到过的,身份验证的目的是知道“你”是谁,而授权则是判断“你”是否有权限访问资源。但是从上一篇文章开始介绍的OAuth相关的内容都是用来做身份验证。授权协议用来做身份验证,所以说是矛盾的。OpenID Connect就是为了弥补OAuth协议的缺陷,而在OAuth协议基础上进行补充拓展的一个身份验证协议。它包含了如发现服务、动态注册、Session管理、注销机制等新的高级特性。
使用OAuth来做身份验证,只是因为OAuth相对简单,适合小型项目,这个与OAuth是授权协议还是身份验证协议无关,它关注的是能否满足需求,包括app.UseOAuthBearerAuthentication方法名称都是Authentication而不是Authorization,通过添加OAuth Bearer身份验证中间件来实现身份验证。OpenID Connect更适合于大型项目,在这里就不再深入介绍。
关于OAuth与OpenID Connect的内容可参考 blackheart的博客。感谢 blackheart给我提的意见。^_^
小结
本章介绍了Jwt以及Jwt在.Net中的实现,并介绍了在.Net中如何使用Jwt Token实现基于OAuth的身份验证。使用Jwt Token最主要的是为了解决不同应用的Token识别问题。最后简单的说明了OAuth与OpenID Connect的区别,它们取舍的关键点在于需求,对于小型应用来说OAuth就能够满足,而由于OpenID Connect非常复杂,如果有需求时也可以先考虑使用如IdentityServer这些开源组件。
与身份验证相关的内容暂时到此,关于.Net安全相关内容可以参考下面的博客,非常全面包含了身份验证以及.Net中的加解密等内容:https://dotnetcodr.com/security-and-cryptography/
参考:
https://dzone.com/articles/whats-better-oauth-access-tokens-or-json-web-token
https://stackoverflow.com/questions/32964774/oauth-or-jwt-which-one-to-use-and-why
http://openid.net/specs/draft-jones-oauth-jwt-bearer-03.html
https://tools.ietf.org/html/rfc7523
https://auth0.com/learn/json-web-tokens/
https://stackoverflow.com/questions/39239051/rs256-vs-hs256-whats-the-difference
https://stackoverflow.com/questions/18677837/decoding-and-verifying-jwt-token-using-system-identitymodel-tokens-jwt
http://www.c-sharpcorner.com/UploadFile/4b0136/openid-connect-availability-in-owin-security-components/
https://security.stackexchange.com/questions/94995/oauth-2-vs-openid-connect-to-secure-api
https://www.cnblogs.com/linianhui/archive/2017/05/30/openid-connect-core.html
本文链接:http://www.cnblogs.com/selimsong/p/8184904.html
ASP.NET没有魔法——目录
相关文章推荐
- ASP.NET没有魔法——ASP.NET OAuth、jwt、OpenID Connect
- ASP.NET没有魔法——ASP.NET OAuth、jwt、OpenID Connect
- IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
- IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
- ASP.NET 中OAUTH 2.0 及OPENID CONNECT的介绍
- IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
- ASP.NET Core 认证与授权[3]:OAuth & OpenID Connect认证
- 入门教程:.NET开源OpenID Connect 和OAuth解决方案IdentityServer v3 MVC认证与授权(四)
- IdentityServer3——入门教程:.NET开源OpenID Connect 和OAuth解决方案IdentityServer v3 介绍
- 第7章 成员资格、授权(Authorize、ASP.NET Identity、OAuth和OpenID的外部登录)和安全性
- ASP.NET Core的身份认证框架IdentityServer4(9)-使用OpenID Connect添加用户认证
- IdentityServer3——入门教程:.NET开源OpenID Connect 和OAuth解决方案IdentityServer v3 术语
- Asp.Net MVC 4 Web API 中的安全认证-使用OAuth
- Asp.Net MVC 4 Web API 中的安全认证-使用OAuth
- Introduction: Connect to SQL Membership with ASP.NET Application
- 最近在看 ASP.NET 5,有关官方实现的 OAuth 2 包
- ASP.NET WebApi OWIN 实现 OAuth 2.0
- QQ登录接口集成,QQ+登录ASP.net+代码,+QQ+oauth的使用
- QQ登录接口集成,QQ+登录ASP.net+代码,+QQ+oauth的使用
- ASP.NET Web API与Owin OAuth:使用Access Toke调用受保护的API