上一篇文章实现了IdentityServer4与Asp.net core Identity的集成,可以使用通过identity注册功能添加的用户,以Password的方式获取Access token,但是无论是Client Credentials还是Password流程它都是OAuth2.0的流程,本篇文章就来先介绍一下关于OpenIDConnect的基本概念和用法。 本文有以下内容:NOI Linux 快速入门指南
OpenIDConnect介绍及基本概念
根据OpenIDConnect的定义简单来说,OpenIDConnect=(Identity, Authentication)+Oauth2.0(来自: https://openid.net/connect/faq/) 另外从下面的回答可以看出OAuth2.0是一个身份验证/授权框架,而OpenID Connect基于这些提供了身份标识功能,身份标识就是“是谁”的 问题。
至于oidc如何实现的,详情可以查看文档:https://openid.net/specs/openid-connect-core-1_0.html,从文档中可以找到这样几个关键词:ID Token、Authentication、Authentication Request、Authorization Code Flow、Implicit Flow、Hybrid Flow、Response_Type、Authorization Endpoint、Token Endpoint。
以及两个表,OIDC身份验证流程表:


- ID Token:是一个包含特定声明(Claim)的jwt,特定的声明指的是身份验证服务器验证终端用户时候产生的供客户端使用的信息,如发行人(issuer)、最终用户标识(sub)、客户端id(aud)、过期时间(exp)、Token的发布时间(iat)、用户身份验证时间(auth_time)等,另外也可以包含其它的声明。ID Token由身份验证服务器(IdentityServer4,OP)颁发,交由客户端(RP)进行验证。
- Authentication:由IdentityServer4(OP)提供的身份验证(登录),最终用户通过IdentityServer4(OP)的身份验证(登录)后,就可以发起Authentication Request,或者说如果在发起Authentication Request时用户未进行身份验证时将重定向到身份验证界面进行身份验证。
- Authentication Request:向IdentityServer4(OP)的授权终结点发起的,用于获取ID Token、授权码(Authorization Code)甚至是访问Token(Access Token)的请求。
- Authorization Code Flow、Implicit Flow、Hybrid Flow:Authentication Request的三种不同请求流程。
- Response_Type:Authentication Request的参数之一,根据设定该参数来决定使用哪一种请求流程。
- Authorization Endpoint:授权终结点,用于接收Authentication Request。
- Token Endpoint:令牌终结点,用于接收访问令牌(Access Token)获取请求。
OIDC授权码流程及实现
下面以授权码流程为例进行详细解说,首先授权码流程步骤如下:

确保“interactive”这个客户端的重定向地址为“应用程序地址/signin-oidc”,这里需要注意的是这个重定向地址实际上是客户端(WebApi)通过方法.AddOpenIdConnect添加的用于处理odic身份验证的身份验证处理器:

下面是登录页面url信息:
你可能不知道的 transition 技巧与细节





Access Token:




OIDC隐式流程及实现
既然最复杂的授权码流程已经能够实现了,那么简单的隐式流程肯定没问题,下面就演示一下如何通过隐式流程将token直接获取到浏览器中。 首先创建一个支持隐式流程的client:




小结
本篇文章介绍了OpenIDConnect的基本概念,并通过已有的IdentitySever程序演示了基于授权码和隐式流程,其中授权码模式是一种较为安全的模式,所有的关键的数据包括授权码以及各类token均在client的后台完成,如果需要可以把相关的token加密后以cookie的方式放到客户端以供后续使用。而隐式模式可以将各类token返回到浏览器中,这种模式可以在单页应用中使用,将token交由js来进行管理并用于受保护资源的访问。 另外到目前为止我们可以看到的是IdentityServer或者说IdentityServer4的作用就是校验Client信息、终端用户的用户名密码信息,然后生成授权码以及各类token,而token的验证和使用实际上还是在Client中进行的。 最后OIDC是一个身份验证协议,那么身份验证和授权在Asp.net core应用程序中是如何体现的呢?下篇文章就来聊聊这个问题。 参考: https://openid.net/specs/openid-connect-core-1_0.html https://openid.net/connect/faq/ https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-protocols-oidc 本文链接: https://www.cnblogs.com/selimsong/p/14355150.html 从零搭建一个IdentityServer——目录一文打尽端口复用 VS Haproxy端口复用
发表评论