搜狐快站建设pc网站,威海房产网,桂林生活网二手房,个人网站网站建设方案书前言我们现在日常生活中#xff0c;会使用各式各样的应用程序#xff0c;层出不穷#xff0c;其中有基于网页浏览方式的应用#xff0c;有基于手机端的App#xff0c;甚至有基于流行的公众号和小程序等等#xff0c;这些应用#xff0c;我们不仅要实现各个应用的功能之外… 前言我们现在日常生活中会使用各式各样的应用程序层出不穷其中有基于网页浏览方式的应用有基于手机端的App甚至有基于流行的公众号和小程序等等这些应用我们不仅要实现各个应用的功能之外还要考虑各个应用之间的交互作用其中身份的认证和授权就是每个应用必不可少的的一部分。所以我们以身份认证和授权这一部分为例需要考虑各个应用直接的交互统一管理以及信息安全问题。而现在的互联网对于信息安全要求又十分苛刻所以一套统一的身份认证和授权就至关重要。所以我们可以根据Identity Server4框架开发一套统一的身份认证和授权项目应用在平时的多个项目中实现多平台应用授权统一管理。说明我们通过查看 IdentityServer4官网就可以看到给出的定义IdentityServer4 is an OpenID Connect and OAuth 2.0 framework for ASP.NET Core.
OpenID Connect OAuth2.0 相结合的认证框架由此可见IdentityServer是基于OpenID Connect协议标准的身份认证和授权程序实现了OpenID Connect和OAuth2.0协议的结合。所以IdentityServer4是为ASP.NET CORE量身定制的实现了OpenId Connect和OAuth2.0协议的认证授权中间件。通常你构建或重新使用包含登录和注销页面的应用程序IdentityServer中间件会向其添加必要的协议头以便客户端应用程序可以使用这些标准协议与其对话。2.1 特性通过不同的文献使用的术语我们会发现同一个概念可能存在着多种解释比如有些把他称为安全令牌服务Security Token Service 身份提供Identity Provider授权服务器Authorization ServerIP-STS 等等。其实他们都是一个意思目的都是在软件应用中为客户端颁发令牌并用于安全访问的。2.2 功能引申3.1 OAuth2.0OAuth2.0 是OAuth协议的延续OAuth2.0 关注客户端开发者的简易性为用户资源提供一个安全的、开放而有建议的标准。是目前流行的授权机制用于授权第三方应用就可以获取该用户资源。因此OAuth是安全的。为了安全Oauth2.0 引入了两个措施1Oauth2.0 要求refresh token 一定是保存在客户端的服务器上的而绝不能存放在狭义的客户端例如移动 app、PC端软件 上。调用 refresh 接口的时候一定是从服务器到服务器的访问2Oauth2.0 引入了 client_secret 机制。即每一个 client_id 都对应一个 client_secret。这个 client_secret 会在客户端申请 client_id 时随 client_id 一起分配给客户端。客户端必须把 client_secret 妥善保管在服务器上决不能泄露。刷新 access token 时需要验证这个 client_secret。3.1.1 场景OAuth2.0 是目前最流行的授权机制用来授权第三方应用获取用户数据。以下以 第三方A网站用户访问授权获取在B网站资源 为例 。参考理解OAuth 2.0为了让A网站应用访问在B网站上的存储的照片、视频或者联系方式等等私密资源我们可能需要做到的就是让B网站同意A网站访问读取这些资源那么在传统的方式中会将自己在B网站中的用户名和密码告诉A后者就可以读取用户的资源信息了但是这样做存在了严重的问题A网站为了后续服务会保存用户的密码这样不安全。B网站必须部署密码登录方式才能以此方式获取但这种单纯的密码登录也不安全。A网站用户获取某个网站资源的权力但却没有限制获取的范围和期限。当用户修改密码的时候就会收回A网站的权力但是这样做会使得其他所有获得用户授权的A应用程序全部失效。只要有一个A应用程序被破解就会导致用户密码泄漏以及所有被密码保护的数据泄漏。因此这种方式是不安全的所以为了解决这种问题OAuth就解决了这种问题。允许用户让第三方A应用访问该用户在B网站上存储的私密的资源如照片视频联系人列表而无需将用户名和密码提供给第三方应用。就比如我用QQ登录博客园那博客园第三方应用的昵称就可以是我的QQ某网站昵称它获取到了我的QQ昵称并存到了博客园的数据库我以后就一直可以使用QQ来登录博客园但是博客园却不知道我QQ的用户名和密码。3.1.2 说明OAuth在客户端与服务提供商之间设置了一个授权层authorization layer。客户端不能直接登录服务提供商只能登录授权层以此将用户与客户端区分开来。客户端登录授权层所用的令牌token与用户的密码不同。用户可以在登录的时候指定授权层令牌的权限范围和有效期。客户端登录授权层以后服务提供商根据令牌的权限范围和有效期向客户端开放用户储存的资料。A用户打开客户端以后客户端要求用户给予授权。B用户同意给予客户端授权。C客户端使用上一步获得的授权向认证服务器申请令牌。D认证服务器对客户端进行认证以后确认无误同意发放令牌。E客户端使用令牌向资源服务器申请获取资源。F资源服务器确认令牌无误同意向客户端开放资源。3.1.3 模式用户怎样实现客户端授权所以需要通过不同的授权模式让客户端可以获取令牌进而获取资源。因此客户端获取授权常用的模式如下后续篇章会对这些模式进行说明和搭建应用项目。3.2 OpenID ConnectOpenID Connect是基于OAuth 2.0规范族的可互操作的身份验证协议。它使用简单的REST / JSON消息流来实现和之前任何一种身份认证协议相比开发者可以轻松集成。OpenID Connect允许开发者验证跨网站和应用的用户而无需拥有和管理密码文件。OpenID Connect允许所有类型的客户,包括基于浏览器的JavaScript和本机移动应用程序,启动登录流动和接收可验证断言对登录用户的身份。进一步来说OpenID Connect是OAuth 2.0协议之上的简单身份层用 API 进行身份交互的框架允许客户端根据授权服务器的认证结果最终确认用户的身份以及获取基本的用户信息它支持包括Web、移动、JavaScript在内的所有客户端类型它是可扩展的协议允许你使用某些可选功能如身份数据加密、OpenID提供商发现、会话管理OpenID Connect vs OpenID 2.0OpenID Connect完成很多与OpenID 2.0即认证对用户的身份进行认证判断其身份是否有效相同的任务是API-friendly定义了可选的签名和加密的机制OAuth 1.0和OpenID 2.0的集成需要扩展而OpenID Connect协议本身就建立在OAuth 2.0之上。(身份验证) OAuth 2.0 OpenID Connect因此OpenID Connect 是“认证”和“授权”的结合。我们经常会混淆OpenID和OAuth协议之间的关系下文会对这两者进行区分说明。为什么开发者要使用OpenID Connect因为它很简单,可靠,安全,并让他们摆脱困难和危险的存储和管理别人的密码。也有好处,它让用户的生活更容易在网站注册和注册从而减少遗弃。区别4.1 OAuth 与 OpenID首先来认识两个英文单词也是我们在平时中很容易混淆的。authorization : n. 授权认可批准委任。authentication : n. 证明鉴定证实。而在认证授权服务中也应用了这两个单词的表面意思。OpenID 是一个以用户为中心的数字身份识别框架它具有开放、分散性。OpenID 的创建基于这样一个概念我们可以通过 URI 又叫 URL 或网站地址来认证一个网站的唯一身份同理我们也可以通过这种方式来作为用户的身份认证。OpenID 是Authentication即认证对用户的身份进行认证判断其身份是否有效也就是让网站知道“你是你所声称的那个用户”。侧重的是authentication即证明 “用户是谁”OAuth 是Authorization即授权在已知用户身份合法的情况下经用户授权来允许某些操作也就是让网站知道“你能被允许做那些事情”。侧重的是authorization 即授权 “用户能做什么”由此可知授权要在认证之后进行只有确定用户身份只有才能授权。4.1.1 场景OpenID 是证实身份Authentication作用的就好比我们参加大型考试一下进考场的时候监考官需要我们拿出身份证和准考证来检验比对是否是同一个人。这个过程就是在验证 “身份这就是我”同时也证实了这不是一个匿名伪造的不可信任信息。考官比对身份成功后就会进一步询问。比如我用 Google 的 OpenID 服务登录 xxx.com xxx.com 先把我导向 Google 的授权页面我使用 Google 帐号 testgmail.com 登录并同意后页面跳回 xxx.com xxx.com 拿到了我的“唯一标识”这个唯一标识可能是 abbcccxxxxxxxddccddxxxx11 xxx.com 从这个字符串里无法获得任何 xxxgmail.com 的个人信息甚至连邮箱地址也不知道 xxx.com 只知道以后只要使用谷歌登录并返回 abbcccxxxxxxxddccddxxxx11 这个标识符那就是我在登录。但是如果你想在认证过程中获得用户的其他信息比如手机号等 就得多做一步了。OAuth 是关于授权、许可Authorization的当考官看完比对你的身份后还要求掏出兜里的东西拿出随身携带里的东西、手机等随身物品以便检查检查你是否携带考场违规物品这时就需要得到被检查人的许可才行被检查人有权利扭头就走但要想进场考试必须给予许可、配合检查。这是在回答「我同意让你对我进一步做些什么」是为了在被授予权限的前提下更多的获取除了个人信息以外身上携带的东西是否包含违规物品。如手机计算器手表非指定文具等我想通过微博登录 xxx.com xxx.com 要先把我 redirect 到新浪微博的授权页面我通过微博帐号登录并授权后页面跳回 xxx.com xxx.com 拿到我的访问 token 后还要再调用一个接口来获得我的会员 UID 这个 UID 就是新浪用户的“唯一标识”了。 # 借鉴网友的说明 如今越来越多的网站以及一些应用程序都开始使用第三方社交平台账户登录那这里就会涉及到安全性的问题隐私的问题你不能随意来获取我的资料当然你来使用我的资料你要经过用户的同意那这个用户是不是我平台上还是要来向我求证那在这个过程中实际上就出现了两个过程我们还是直接使用上次的例子来说明比较直观博客园使用QQ登录进入博客园的登录页点击使用QQ登录在进入到QQ登录界面后最开始是要请求认证用户输入QQ号和密码点击登录腾讯互联会先进行验证该用户是否为我的用户如果是我的用户那么我会通知你博客园他是我的用户你可以使用该账户登录你的系统这个过程就是认证Authentication认证就是证明你是谁你是否是真实存在的就好像快递员来给你送快递让你出示你的身份证他确定你是本人后把快递给你这就是OpenID。而在QQ授权登录下方有两给CheckBox复选框可以允许博客园获得您的昵称、头像、性别这是在认证之后的事了在腾讯互联你是我平台的用户后你可以自己选择博客园是否有权去获取你的相关信息当你勾选后腾讯互联就把你的这些基本信息给了博客园这个过程就是授权Authorization授权就是确定了你是谁后又把属于你的东西给了别人犹如你向快递员出示了身份证然后你又把你房门的密码给了他并告诉他说我把房门密码给你你帮我放到我客厅里吧。
可以看出OAuth 相对于 OpenID 最大的区别就是网站在认证授权的过程中实际上是拿到了你的帐户访问权限继而确认你的身份但是这同时也存在一个安全隐患因为网站在拿到你的“唯一标识”的同时还拿到了一把你的账户的 “临时钥匙”。但是你不知道网站会不会拿这把钥匙“干坏事”这个只有站长心里清楚。同时 OAuth 还比 OpenID 多了几个额外的请求步骤登录所费时间一定是长于 OpenID 的。4.2 OAuth、OpenID 与 OpenID ConnectOpenID Connect 因为其基于OAuth协议可以看上文OAuth说明所以OpenID-Connect协议中也包含了client_id、client_secret还有redirect_uri等字段标识。这些信息被保存在“身份认证服务器”以确保特定的客户端收到的信息只来自于合法的应用平台。这样做是目的是为了防止client_id泄露而造成的恶意网站发起的OIDC流程。OpenID Connect完成很多与OpenID 2.0 相同的任务是API-friendly定义了可选的签名和加密的机制。OAuth 1.0 和 OpenID 2.0 的集成需要扩展而OpenID Connect协议本身就建立在OAuth 2.0之上。因此OpenID Connect 是“认证”和“授权”的结合。(身份验证) OAuth 2.0 OpenID Connect (OIDC) ( Authentication Authorization OAuth2.0)简要而言OIDC是一种安全机制用于应用连接到身份认证服务器Identity Service获取用户信息并将这些信息以安全可靠的方法返回给应用。# 借鉴网友说明
举个例子。某个用户使用*Facebook*应用*“What online quiz best describes you?”* 该应用可以通过*Facebook*账号登录则你可以在应用中发起请求到“身份认证服务器”也就是Facebook的服务器请求登录。这时你会看到界面询问是否授权。在 OAuth 中这些授权被称为scope。OpenID-Connect也有自己特殊的scope--openid ,它必须在第一次请求“身份鉴别服务器”Identity Provider,简称IDP时发送过去。
4.3 JWT 与 OAuth2 .0要比较JWT和OAuth2首先要明白一点就是这两个根本没有可比性是两个完全不同的东西。但是既然是没有可比性为何还要放一块比较呢实际开发应用中就发现很多拿 JWT和OAuth2.0 作对比很多情况下在讨论OAuth2的实现时会把JSON Web Token作为一种认证机制使用。这也是为什么他们会经常一起出现。4.3.1 内容区别JWT是一种认证协议 JWT提供了一种用于发布接入令牌Access Token)并对发布的签名接入令牌进行验证的方法。令牌Token本身包含了一系列声明应用程序可以根据这些声明限制用户对资源的访问。一个token包含三部分header、claims、signatureOAuth2是一种安全的授权框架提供了一套详细的授权机制。用户或应用可以通过公开的或私有的设置授权第三方应用访问特定资源。Oauth2定义了一组想当复杂的规范。涉及到Roles角色、Client Types客户端类型、Client Profile客户端描述、Authorization Grants认证授权、Endpoints终端等。4.3.2 场景区别jwt应用场景1无状态的分布式APIJWT的主要优势在于使用无状态、可扩展的方式处理应用中的用户会话。服务端可以通过内嵌编码的声明信息很容易地获取用户的会话信息而不需要去访问用户或会话的数据库。但是如果系统中需要使用黑名单实现长期有效的token刷新机制这种无状态的优势就不明显了。Oauth2应用场景1第三方认证服务器2大型企业解决方案API的使用依赖于外部的第三方认证提供者。去认证服务商 那里注册你的应用然后设置需要访问的用户信息比如电子邮箱、姓名等。当用户访问站点的注册页面时会看到连接到第三方认证提供商的入口。用户点击以后被重定向到对应的认证服务商网站获得用户的授权后就可以访问到需要的信息然后重定向回来你的应用中。4.3.3 归纳说明Oauth2和JWT是完全不同的两种东西一个是授权认证的框架另一种则是认证验证的方式方法。OAuth2不像JWT一样是一个严格的标准协议因此在实施过程中更容易出错。两种方案都需要SSL安全保护也就是对要传输的数据进行加密编码。安全地传输用户提供的私密信息在任何一个安全的系统里都是必要的。否则任何人都可以通过侵入网络在用户登录的时候窃取用户的用户名和密码等信息。总结本篇主要是对Identity Server4的说明认识到是一个基于OpenID Connect协议标准的身份认证和授权程序。简单的涉及对基础知识的认识以及区别说明从OAuth、OpenID、OpenID Connect以及JWT等进行对比区别说明。在后续中会对Identity Server4中常用术语说明多种授权模式数据库持久化以及UI界面优化和常见问题搭建一个完整可用的认证授权项目。如果有不对的或不理解的地方希望大家可以多多指正提出问题一起讨论,不断学习,共同进步。资料Identity Server 官方文档JSON Web Token理解OAuth 2.0Identity Server 授权类型