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

时间:2021-02-23 23:25:01

标签: asp.net-core identityserver4

我正在学习 identityserver4 并且无法理解一些东西。

不久:我想在 ASP.NET MVC 客户端使用电子邮件和密码授权最终用户(它将用户凭据发送到令牌服务器以获取令牌),并且我不希望第三方客户端检索来自我的 API 资源的数据。

正如我从文档中了解到的:

  • 隐式流程用于 SPA(js 客户端)并使用 id_token 对用户进行授权。我可以在浏览器中存储 id_token。

  • 客户端凭据流用于受信任的应用程序(如 ASP.NET MVC 客户端)来授权客户端并使用 access_code。我可以将 access_code 存储在我的应用中。

所以看起来我需要一个混合流。

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

<块引用>

从技术上讲,令牌存储在 cookie 的属性部分。

所以我的问题:

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

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

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

1 个答案:

答案 0 :(得分:1)

今天您不应该使用隐式流,它已从 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?如果是 - 在哪一刻我应该使用电子邮件/密码授权用户以及如何在我的 ASP.NET MVC 客户端后端的一个 JWT 中组合所有令牌,当我将请求发送到 api 资源时?

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

今天,当您使用身份验证代码流时,您将用户重定向到 IdentityServer,然后让用户登录那里,而不是将用户名/密码从浏览器传递给 identityserver。