Oauth 2.0 Thinktecture identity server客户端的选择和实现

Oauth 2.0 Thinktecture identity server客户端的选择和实现,oauth-2.0,authorization,thinktecture-ident-server,identityserver3,identityserver4,Oauth 2.0,Authorization,Thinktecture Ident Server,Identityserver3,Identityserver4,我正试图用identity server让我的头脑脱离云端 我想实现identity server项目,以便进行身份验证 一个ASP.NETMVC5应用程序 ASP.NET Web API windows服务实现 Int我已经阅读了一些关于客户的详细信息。作者只是说: OAuth2为不同的用例提供了几种“授权类型”。这个 定义的补助金类型包括: 在web服务器上运行的应用程序的授权代码 基于浏览器或移动应用的隐式 使用用户名和密码登录的密码 用于应用程序访问的客户端凭据 授权代码和隐式代码之间有

我正试图用identity server让我的头脑脱离云端

我想实现identity server项目,以便进行身份验证

  • 一个ASP.NETMVC5应用程序
  • ASP.NET Web API
  • windows服务实现
  • Int我已经阅读了一些关于客户的详细信息。作者只是说:

    OAuth2为不同的用例提供了几种“授权类型”。这个 定义的补助金类型包括:

  • 在web服务器上运行的应用程序的授权代码
  • 基于浏览器或移动应用的隐式
  • 使用用户名和密码登录的密码
  • 用于应用程序访问的客户端凭据
  • 授权代码和隐式代码之间有什么区别?这是否意味着隐式应该被javascript代码使用

    可以说我需要:

  • ASP.NET MVC应用程序的密码授予
  • Web API的客户端凭据
  • windows服务的授权码
  • 还有一个问题,我想在我的web api中实现基于承载令牌和简单apiKey的授权。两种类型都能粘合吗?如何使用Identity server实现apiKey


    非常感谢,如果这些都是愚蠢的问题,请原谅。

    我尽了最大努力让这个答案简短(但我不得不添加大量的上下文来理解答案)

    机密与公共客户的对比

    客户机(代表您请求访问的应用程序–MVC应用程序、SPA等)根据其使用授权服务器(在我们的案例中为Identity server)进行安全身份验证的能力被归类为机密和公共客户机

    例如,Web应用程序(MVC应用程序)被视为机密客户端,因为它是在安全服务器上实现的,并且能够通过授权服务器进行安全客户端身份验证(通过后台通道–不需要用户代理或公共通道)。 此外,它还可以维护秘密令牌(基本上是客户端凭据、访问令牌和刷新令牌),这些令牌受保护不受公共访问(例如,由用户代理/资源所有者)

    然而,基于用户代理的应用程序(SPA)和本机应用程序(移动应用程序)被视为公共客户端。这是因为协议数据和客户端凭据很容易被资源所有者访问

    授权码授予

    将授权代码授权定义为:

    “授权码授权类型用于获取两种访问权限 令牌和刷新令牌,并针对机密客户端进行了优化。 由于这是一个基于重定向的流,因此客户端必须能够 与资源所有者的用户代理(通常是web)交互 浏览器)并能够接收传入请求(通过重定向) 来自授权服务器。“

    这仅仅意味着,授权代码流针对通过用户代理(浏览器)与资源所有者交互的机密客户端进行了优化,该用户代理(浏览器)能够接收和重定向来自身份验证服务器(Identity Server)的传入请求

    抽象地说,授权代码流具有以下顺序:

    • 资源所有者使用授权进行身份验证(通过–用户代理) 并获取授权代码
    • 资源所有者提供 客户端的授权代码(从重定向后通过用户代理) 授权服务器)
    • 客户端通过授权服务器(通过后台通道请求)进行身份验证,并交换授权\u代码以获取访问\u令牌
    • 访问令牌存储在客户机中,资源所有者被重定向到相应的资源
    • 由于客户端(MVC应用程序)具有access_令牌,因此它可以请求刷新 来自授权服务器的令牌(如果需要)
    • 不过,重要的一点是,授权代码流中的资源所有者从未看到(或有权访问)access\u令牌。客户端安全地存储它

    隐性补助

    将隐性授权定义为:

    “隐式授权类型用于获取访问令牌(不包括 支持发布刷新令牌),并针对公共 已知操作特定重定向URI的客户端。这些客户端 通常在浏览器中使用脚本语言(如 作为JavaScript

    由于这是一个基于重定向的流,因此客户端必须 能够与资源所有者的用户代理进行交互 (通常是web浏览器)并能够接收传入请求 (通过重定向)从授权服务器

    不像 授权码授权类型,客户机在其中进行单独授权 对授权和访问令牌的请求,客户端 接收作为授权请求结果的访问令牌

    隐式授权类型不包括客户端身份验证,并且 依赖于资源所有者的存在和 重定向URI。因为访问令牌被编码到 重定向URI,它可能会暴露给资源所有者和其他用户 驻留在同一设备上的应用程序“

    授权代码和隐式代码之间的区别

    因此,主要区别在于:

    • 在隐式授权中,客户端不单独请求授权和访问令牌
    • 授权和访问令牌都传递给资源所有者,编码到重定向URI中
    • 这会导致此处描述的安全漏洞
    • 由于这些安全问题,根据体系结构,刷新令牌不会颁发给公共客户端(它们无法维护客户端机密,因此无法访问\u令牌和刷新令牌)
    这意味着隐式应该被javascript使用 密码

    对。由于以上讨论的细节,作为一种常见做法,大多数JS/SPA使用Oauth2 impli