ASP.NET MVC 客户端的混合流身份验证
Authentication for hybrid flow for ASP.NET MVC client
我正在学习 identityserver4,有些东西看不懂。
很快:我想在 ASP.NET MVC 客户端使用电子邮件和密码授权最终用户(它将用户凭据发送到令牌服务器以获取令牌),我不想要第三方-派对客户从我的 API 资源中检索数据。
据我从文档中了解到:
隐式流用于SPA(js客户端),使用id_token授权用户。我可以在我的浏览器中存储 id_token。
客户端凭据流用于受信任的应用程序(如 ASP.NET MVC 客户端)授权客户端并使用 access_code
。我可以在我的应用程序中存储 access_code
。
看来我需要一个混合流程。
在 documentation 我读到我需要使用 AddOpenIdConnect()
方法和
Technically the tokens are stored inside the properties section of the cookie.
所以我的问题:
如果 id_token
可以存储在浏览器中,为什么将 access_token
存储在那里也不安全?
如文档所述,令牌存储在 cookie 的属性部分中。这很令人困惑,因为一些指南说,在那里存储 access_token
是不安全的。那么我应该在 ASP.NET MVC 客户端中的什么地方存储访问令牌?
我说得对吗,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。
我正在学习 identityserver4,有些东西看不懂。
很快:我想在 ASP.NET MVC 客户端使用电子邮件和密码授权最终用户(它将用户凭据发送到令牌服务器以获取令牌),我不想要第三方-派对客户从我的 API 资源中检索数据。
据我从文档中了解到:
隐式流用于SPA(js客户端),使用id_token授权用户。我可以在我的浏览器中存储 id_token。
客户端凭据流用于受信任的应用程序(如 ASP.NET MVC 客户端)授权客户端并使用
access_code
。我可以在我的应用程序中存储access_code
。
看来我需要一个混合流程。
在 documentation 我读到我需要使用 AddOpenIdConnect()
方法和
Technically the tokens are stored inside the properties section of the cookie.
所以我的问题:
如果
id_token
可以存储在浏览器中,为什么将access_token
存储在那里也不安全?如文档所述,令牌存储在 cookie 的属性部分中。这很令人困惑,因为一些指南说,在那里存储
access_token
是不安全的。那么我应该在 ASP.NET MVC 客户端中的什么地方存储访问令牌?我说得对吗,
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。