Asp.net mvc 它是如何发生的。Identity Server4用户登录页面重定向。重定向URL的目的

Asp.net mvc 它是如何发生的。Identity Server4用户登录页面重定向。重定向URL的目的,asp.net-mvc,asp.net-core,asp.net-identity,identityserver4,Asp.net Mvc,Asp.net Core,Asp.net Identity,Identityserver4,我对Asp.net core identity和identity Server 4非常陌生。我正在学习关于使用OpenID连接asp.net核心和Identity server 4实现身份验证的在线培训课程 如果我进一步说明我的解决方案,将Asp.net核心mvc web应用程序作为客户端。另一个asp.net核心mvc web应用程序作为IDP(Identity Server4)和另一个asp.net核心mvc webapi作为资源服务器 对于未经身份验证的用户,将显示IDP上的登录页面。我的

我对Asp.net core identity和identity Server 4非常陌生。我正在学习关于使用OpenID连接asp.net核心和Identity server 4实现身份验证的在线培训课程

如果我进一步说明我的解决方案,将Asp.net核心mvc web应用程序作为客户端。另一个asp.net核心mvc web应用程序作为IDP(Identity Server4)和另一个asp.net核心mvc webapi作为资源服务器

对于未经身份验证的用户,将显示IDP上的登录页面。我的问题是,客户端web(asp.net核心web应用程序)如何知道用户未通过身份验证?我的猜测是,当用户首次访问web app访问令牌未出现在授权头上时,身份验证中间件知道这不是身份验证请求,并将请求重定向到IDP是否正确

然后用户重定向到帐户控制器的逻辑视图,该重定向在IDP上是如何配置的(我的意思是这里是如何准确重定向到帐户控制器登录页面的)

此外,在IDP上配置RedirectURI()的目的是什么。它是如何工作的


顺便说一句,我在这里使用的是授权代码流和IdentityServer4.Quickstart.UI AccountController。您知道什么api需要身份验证,因此,如果您在任何地方都没有此令牌可用,则应将用户重定向到oauth服务器。一旦这一个重定向回您的应用程序,您将在url中找到令牌(如果我的内存良好,它的一个参数)。此令牌必须保存在内存中以供以后使用,或保存在应用程序数据库(标准浏览器功能)中。然后,您可以使用存储的这个令牌调用api

如果您不知道什么api需要身份验证,或者您的令牌已过期,那么您仍然会调用该api,然后会出现403错误(未授权)。任何403错误都会使客户端应用程序决定重定向身份验证门户上的用户以获取新令牌

在使用代码流时,我想您必须开发react、angular或任何spa应用程序。所以我建议您使用oidc客户端。这是一个javascript库,由开发identity server的人开发。在处理oauth身份验证时,它使客户端的开发变得非常简单

以下是对完成/使用的流程和检查/变量的更详细描述:

  • 客户端应用程序(javascript/html5)对资源服务器进行调用,而在身份验证http请求头中没有任何令牌
  • 资源服务器(您的api服务器)尝试获取标头中的令牌
  • 不存在。这意味着请求没有经过身份验证
  • 甚至在进行任何控制器调用或授权检查(角色等)之前,资源服务器都会向客户端返回403错误
  • 客户端捕捉到这个403错误,然后知道这个调用需要一个令牌
  • 客户端将失败请求的url及其post(如果适用)存储在应用程序数据库中
  • 客户端通过传输客户端id(认证服务器的javascript/html5应用程序的标识符)、作用域(此客户端应用程序在此认证请求上下文中应使用的资源集),将浏览器重定向到认证服务器url以及身份验证服务器在用户通过身份验证后应将其重定向回的url
  • 身份验证服务器要求用户进行身份验证(以您可以想象的任何方式,但大多数情况下都是通过向用户询问登录名和密码)
  • 如果用户被身份验证服务器(与登录名匹配的密码)识别,则该服务器将检查返回url(客户端应用程序传输的url,用于在用户通过身份验证后在右侧页面重定向用户)是否在此客户端应用程序的授权返回url列表中(您想知道的重定向URI)。这是为了确保颁发的令牌不会传输到未授权的应用程序(就像一个托管在中国的外部javascript/html5应用程序,它可以找到一种方法从您的api服务器中提取一些只有您的用户才能知道的数据,并将其提交到一个俄罗斯api服务器,而用户甚至都没有注意到)
  • 它还检查这个客户端应用程序(而不是用户…这里是为了确保特定的客户端javascript/html5应用程序可以访问一组资源)是否可以使用请求的范围
  • 如果检查正常,身份验证服务器将通过使用其私钥对其进行签名来颁发访问令牌
  • 身份验证服务器通过将url中的访问令牌设置为参数,在最初传输的返回url上重定向用户
  • 客户机应用程序获取此参数并将其存储在某个位置(任意位置,但大部分时间在应用程序数据库和内存中)
  • 客户端应用程序获取为再次执行调用而存储的url,但这次使用身份验证头中的access_令牌
  • api服务器(或资源服务器)再次接收http请求
  • 最后找到一个access_令牌并检查它是否是由身份验证服务器(使用其公钥)实际颁发的,因为它是唯一受信任颁发令牌的层
  • 然后它可以信任令牌中的内容:里面提到的用户id、允许访问的作用域(功能集),等等
  • 然后它调用控制器并返回响应。如果令牌过期(令牌中的简单日期),它不会调用控制器并返回403
仅供参考,如果令牌的签名已由身份验证服务器完成,则令牌中的任何内容都可以被信任。此系统可防止