ASP.NET MVC 客户端的混合流身份验证

Authentication for hybrid flow for ASP.NET MVC client

我正在学习 identityserver4,有些东西看不懂。

很快:我想在 ASP.NET MVC 客户端使用电子邮件和密码授权最终用户(它将用户凭据发送到令牌服务器以获取令牌),我不想要第三方-派对客户从我的 API 资源中检索数据。

据我从文档中了解到:

看来我需要一个混合流程。

documentation 我读到我需要使用 AddOpenIdConnect() 方法和

Technically the tokens are stored inside the properties section of the cookie.

所以我的问题:

  1. 如果 id_token 可以存储在浏览器中,为什么将 access_token 存储在那里也不安全?

  2. 如文档所述,令牌存储在 cookie 的属性部分中。这很令人困惑,因为一些指南说,在那里存储 access_token 是不安全的。那么我应该在 ASP.NET MVC 客户端中的什么地方存储访问令牌?

  3. 我说得对吗,AddOpenIdConnect() 将我的 ASP.NET MVC 应用配置为从令牌服务器自动检索 access_token?如果是 - 我应该在什么时候授权用户使用 email/password 以及如何在我的 ASP.NET MVC 客户端后端将所有令牌组合到一个 JWT 中,当我将请求发送到 api 资源时?

今天您不应该使用隐式流,它已从 Oauth 2.1 开始弃用。您应该使用 PKCE 的授权代码流。 PKCE 是授权代码流的安全增强。

从 OAuth 2.1 开始,您只有两个主要流程:

  • 授权代码流程,用于MVC客户端登录用户到客户端
  • 客户端凭据流,用于 API->API 无人参与的通信。

回答您的问题:

  • 如果 id_token 可以存储在浏览器中,为什么将 access_token 存储在那里也不安全?*

ID-Token 仅用于创建初始用户会话,之后您可以将其丢弃。它在 IdentityServer 中的默认生命周期也只有 5 分钟。

  • 如文档所述,令牌存储在 cookie 的属性部分中。这很令人困惑,因为一些指南说,在那里存储 access_token 是不安全的。那么我应该在 ASP.NET MVC 客户端中的什么地方存储访问令牌?

令牌可以存储在 ASP.NET Core 中的会话 cookie 中,这是安全的。它使用数据保护 API 进行保护/加密。但是,如果您这样做,cookie 的大小会增加很多。

  • 我说得对吗,AddOpenIdConnect() 将我的 mvc 应用配置为从令牌服务器自动检索 access_token?如果是的话——我应该在什么时候向用户授权 email/password 以及当我将请求发送到 api 资源时如何在我的 ASP.NET MVC 客户端后端的一个 JWT 中组合所有令牌?

AddOpenIdConnect 仅处理初始登录并检索第一个 ID 和访问令牌。它不使用刷新令牌处理访问令牌的刷新。为此,您可以添加 IdentityModel library.

今天,当您使用授权代码流时,您将用户重定向到 IdentityServer 并让用户在那里登录,而不是将 username/pwd 从您的浏览器传递到 identityserver。