我对Asp.net核心身份和identity Server 4还很陌生。我正在学习关于使用asp.net核心和Identity server 4的Open Id Connect实现身份验证的在线培训课程。
如果我进一步说明我的解决方案,将Asp.net核心mvc web应用程序作为客户端。另一个asp.net核心mvc web应用程序为IDP(Identity Server4),另一个asp.net核心mvc webapi为资源服务器。
对于未经身份验证的用户,将显示IDP上的登录页面。对我来说,问题是客户端web(asp.net核心web应用程序)如何知道用户未通过身份验证?我的猜测是,当用户第一次访问web应用程序时,访问令牌没有出现在授权头上,所以身份验证中间件知道这不是身份验证请求,并将请求重定向到IDP。这是正确的吗?
然后用户重定向到帐户控制器的逻辑视图,该重定向在IDP上是如何配置的(我的意思是,这里是重定向到帐户控制登录页面的确切方式)?
此外,RedirectUris的目的是什么(https://localhost:44326/signin-oidc)在IDP上配置。以及它是如何工作的
顺便说一下,我在这里使用的是授权代码流和IdentityServer4.Quickstart.UI AccountController。
要么你知道什么api需要身份验证,因此,如果你在任何地方都没有这个令牌,你应该将用户重定向到oauth服务器。一旦这个重定向回你的应用程序,你会在url中找到令牌(如果我的记忆力好的话,它是一个参数)。此令牌必须保存在内存中以备日后使用,或保存在应用程序数据库(标准浏览器功能)中。然后,您可以使用存储的这个令牌来调用api。
如果你不知道什么api需要身份验证,或者你的令牌已经过期,你无论如何都会调用api,然后你会得到403错误(未经授权)。任何403错误都应使客户端应用程序决定重定向验证门户上的用户以获得新令牌。
当您使用代码流时,我想您必须开发一个react、angular或任何spa应用程序。所以我建议你使用oidc客户端。这是一个javascript库,由开发身份服务器的同一个人开发。在处理oauth身份验证时,它使客户端的开发变得非常简单。
这里更详细地描述了完成/使用的过程和检查/变量:
- 客户端应用程序(javascript/html5)在身份验证http请求标头中没有任何令牌的情况下调用资源服务器
- 资源服务器(您的api服务器)尝试获取标头中的令牌
- 不存在。这意味着请求未通过身份验证
- 资源服务器甚至在进行任何控制器调用或授权检查(角色等)之前就向客户端返回403错误
- 客户端捕获这个403错误,然后知道令牌对于这个调用是必要的
- 客户端将失败请求的url及其发布(如果适用)存储在应用程序数据库中
- 客户端通过发送客户端id(用于认证服务器的javascript/html5应用程序的标识符)将浏览器重定向到认证服务器url,范围(该客户端应用程序在该身份验证请求的上下文中应该使用的资源集)和url,身份验证服务器应该在用户通过身份验证后将其重新发送回来
- 身份验证服务器要求用户进行身份验证(以您可以想象的任何方式,但大多数情况下都是通过向他询问登录名和密码)
- 如果身份验证服务器识别出用户(与登录名匹配的密码),则此服务器将检查返回url(客户端应用程序传输的url,以便在用户通过身份验证后用于重定向右侧页面上的用户)是否在该客户端应用程序的授予返回url列表中(您想知道的RedirectUri)。这样做的目的是确保发布的令牌不会传输到未分级的应用程序(比如在中国托管的外部javascript/html5应用程序,它可以找到一种方法从你的api服务器中获取一些只有你的用户才能知道的数据,并在用户甚至没有注意到的情况下将其提交给俄罗斯api服务器)
- 它还检查这个客户端应用程序(而不是用户……这里是为了确保特定的客户端javascript/html5应用程序可以访问一组资源)是否可以使用所请求的范围
- 如果检查正常,则身份验证服务器通过使用其私钥对其进行签名来发出accesstoken
- 身份验证服务器通过将url中的access_token设置为参数,重定向最初传输的返回url上的用户
- 客户端应用程序获取该参数并将其存储在某个位置(您想要的任何位置,但大部分时间都存储在应用程序数据库和内存中)
- 客户端应用程序获取为再次执行调用而存储的url,但这次在身份验证标头中包含access_token
- api服务器(或资源服务器)再次接收http请求
- 最后找到一个accesstoken,并检查它是否真的是由身份验证服务器(使用其公钥)发出的,因为它是唯一受信任发出令牌的层
- 然后它可以信任令牌中的内容:内部提到的用户id、允许访问的范围(功能集)等等
- 则它调用控制器并返回响应。如果令牌过期(令牌中的一个简单日期),它不会对控制器进行任何调用并返回403
仅供参考,如果令牌中的任何内容的签名已由身份验证服务器完成,则该内容都是可信的。该系统可防止中间人的安全漏洞。意思是:一个通过监视网络活动获得令牌的人,会更改令牌中的内容,这样他就可以对你的api服务器进行任何他想要的调用。此令牌中所做的任何更改都将被检测到,因为签名(某种加密哈希)将不再与新内容匹配。这个签名,如果世界上每个人都可以用公钥进行检查,那么只有一层可以用私钥颁发:身份验证服务器。
我试着让它尽可能完整,但对于你自称的新手来说,它仍然是可以理解的。希望这能有所帮助。