百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

在ABP框架中使用OAuth 2.0的推送授权请求(PAR)

ccwgpt 2025-04-08 12:26 23 浏览 0 评论

推送授权请求(PAR)是一项新的OAuth 2.0功能,允许客户端通过直接请求将OAuth 2.0授权请求的有效载荷推向授权服务器,并为他们提供了用作对数据的参考的请求URI在随后的授权端点的请求中。此功能在
https://tools.ietf.org/html/rfc9156
中定义。

Authorization Code Flow

让我们看一下当前ABP框架应用程序中的授权码流。

一个典型的ABP分层架构通常包含以下几个网站:

  • Acme.AuthServer: 集成OpenIddictOAuth2.0认证服务器.
  • Acme.AuthServer.Api.Host: API网站,它使用JWT bearer认证方案并通过Acme.AuthServer网站进行身份认证。
  • Acme.Web: 配置和启用OpenID Connect认证方案从Acme.AuthServer网站进行身份认证。

当我们在 Acme.Web网站尝试使用OpenID Connect认证时,它会构建一个认证请求并在浏览器中重定向到Acme.AuthServer网站。

GET https//auth-server.acme.com/connect/authorize

Query String Parameters:

client_id: AbpApp
redirect_uri: https://web.acme.com/signin-oidc
response_type: code
scope: openid profile email roles phone AbpAPI
response_mode: form_post
nonce: YzVkMj...
state: CfDJ8N...

如果你启用了Pkce,那么code_challengecode_challenge_method参数也会出现在请求中。

code_challenge: mJxMdU...
code_challenge_method: S256

当用户在Acme.AuthServer网站中进行认证后(如用户名和密码或者社交登录),它会在用户同意授权后(consent screen/page)会返回一个codeAcme.Web网站.

Acme.AuthServer网站将构建一个POST请求或者GET请求到Acme.Web网站。

POST https://web.acme.com/signin-oidc

Form Data Parameters(application/x-www-form-urlencoded):

code: LPjZ6C...
state: state: CfDJ8N...
iss: https://auth-server.acme.com/

Acme.Web网站收到code后,它会在应用中(不是浏览器中)发送一个HTTP请求使用获得的codeAcme.AuthServer请求access token

POST https://auth-server.acme.com/connect/token

Form Data Parameters(application/x-www-form-urlencoded):

client_id: AbpApp
client_secret: secret
code: LPjZ6C...
grant_type: authorization_code

到此为止,完成了授权码流的认证流程, 之后我们就可以使用access token来访问Acme.AuthServer.Api.Host网站的API了。

混合流程(Hybrid Flow)与隐式流程(Implicit Flow)和授权码流(Code Flow)类似。我们只讨论授权码流

不过授权码流可能有以下问题:

  • 授权请求可以被修改。通常,客户端应用会将用户的浏览器重定向到授权服务器,并附上授权 URL。没有任何机制可以阻止恶意行为者在将请求发送到授权服务器之前,修改其中的一个或多个参数。
  • 无法保证请求的来源。授权请求通常由客户端应用构建,用户的浏览器负责将其发送到授权服务器。然而,无法保证请求确实是由客户端应用构建的。任何人在知道一些数据(如客户端 ID 和重定向 URI)后,都可以构建一个授权请求。
  • 无法保证机密性。尽管浏览器通过 HTTPS 发送授权请求,但请求参数可能会被第三方应用程序拦截,如代理、负载均衡器,甚至是浏览器插件。这类恶意网络组件可以注入或更改请求参数,更不用说请求本身可能会被记录下来。
  • 浏览器的限制。最后,授权请求中的查询字符串如果过于复杂,可能会遇到浏览器对 URL 长度的限制。

为了解决这些问题,OAuth 2.0定义了Pushed Authorization Requests (PAR)

Pushed Authorization Requests (PAR)

OpenIdDict 6.1.0 版本开始支持Pushed Authorization Requests (PAR)ABP框架第一时间升级OpenIdDict版本(9.2版本可用),并在Volo.OpenIddict.Pro模块中添加了Pushed Authorization Requests (PAR)的配置.

你可以在创建/更新Application的时候配置Pushed Authorization Requests (PAR)


我们在看看使用Pushed Authorization Requests (PAR)的认证流程。

当我们在Acme.Web网站尝试使用OpenID Connect认证时它会在会在应用中(不是浏览器中)发送一个POST请求到授权服务器的par端点。

POST https://auth-server.acme.com/connect/par

Form Data Parameters:

client_id: AbpApp
client_secret: secret
redirect_uri: https://web.acme.com/signin-oidc
response_type: code
scope: openid profile email roles phone AbpAPI
response_mode: form_post
nonce: YzVkMjZmN...
state: CfDJ8NwA4...

如果你启用了Pkce,那么code_challengecode_challenge_method参数也会出现在POST请求中。

code_challenge: mJxMdU...
code_challenge_method: S256

授权服务器检查和验证成功后会返回request_uriAcme.Web应用。

{
"request_uri": "urn:ietf:params:oauth:request_uri:1FPVWn...",
"expires_in": 3599
}

Acme.Web网站收到成功响应后会构建一个授权请求,并在浏览器中重定向到授权服务器。

GET https//auth-server.acme.com/connect/authorize

Query String Parameters:
client_id: AbpApp
request_uri: urn:ietf:params:oauth:request_uri:1FPVWn...

同样, 当用户在Acme.AuthServer网站中通过授权后会返回一个codeAcme.Web网站, 然后就可以继续使用code请求access token了, 和上述的授权码流一样.

在应用中配置并启用PAR

ABPOpenIddict模块默认启用了PAR特性.

ASP NET Core 9.0OpenIdConnect 认证方案OpenIdConnectOptions中增加了一个新的
PushedAuthorizationBehavior
参数,你可以在你的应用中配置它.

描述
UseIfAvailable
如果身份提供者的发现文档或显式的 OpenIdConnect 配置中提供了 PAR 端点,则使用推送授权(PAR)。这是默认值。
Disable
即使身份提供者的发现文档或显式的 OpenIdConnect 配置中提供了 PAR 端点,也永远不使用推送授权(PAR)。如果身份提供者的发现文档表明需要使用推送授权(PAR),则处理将失败。
Require
始终使用推送授权(PAR),并在身份提供者的发现文档或显式的 OpenIdConnect 配置中未提供 PAR 端点时发出错误。
AddAbpOpenIdConnect("oidc", options =>
{
//...
options.PushedAuthorizationBehavior = PushedAuthorizationBehavior.Require;
//...
});

并非全部的认证客户端都支持PAR,比如Blazor WASM还不支持。

总结

Pushed Authorization Requests (PAR) 是一种新的 OAuth 2.0 功能,它增强了授权码流的健壮性。我们推荐你在你的应用中使用它.

参考

  • Volo.OpenIddict.Pro模块 https://abp.io/modules/Volo.OpenIddict.Pro
  • What Are OAuth Pushed Authorization Requests (PAR)? https://auth0.com/blog/what-are-oauth-push-authorization-requests-par/
  • OpenIddict Pushed Authorization Requests (PAR) https://documentation.openiddict.com/configuration/pushed-authorization-requests
  • Support for Pushed Authorization (PAR) in OIDC Handler https://github.com/dotnet/aspnetcore/pull/55069
  • RFC 9156 https://tools.ietf.org/html/rfc9156

相关推荐

十分钟让你学会LNMP架构负载均衡(impala负载均衡)

业务架构、应用架构、数据架构和技术架构一、几个基本概念1、pv值pv值(pageviews):页面的浏览量概念:一个网站的所有页面,在一天内,被浏览的总次数。(大型网站通常是上千万的级别)2、u...

AGV仓储机器人调度系统架构(agv物流机器人)

系统架构层次划分采用分层模块化设计,分为以下五层:1.1用户接口层功能:提供人机交互界面(Web/桌面端),支持任务下发、实时监控、数据可视化和报警管理。模块:任务管理面板:接收订单(如拣货、...

远程热部署在美团的落地实践(远程热点是什么意思)

Sonic是美团内部研发设计的一款用于热部署的IDEA插件,本文其实现原理及落地的一些技术细节。在阅读本文之前,建议大家先熟悉一下Spring源码、SpringMVC源码、SpringBoot...

springboot搭建xxl-job(分布式任务调度系统)

一、部署xxl-job服务端下载xxl-job源码:https://gitee.com/xuxueli0323/xxl-job二、导入项目、创建xxl_job数据库、修改配置文件为自己的数据库三、启动...

大模型:使用vLLM和Ray分布式部署推理应用

一、vLLM:面向大模型的高效推理框架1.核心特点专为推理优化:专注于大模型(如GPT-3、LLaMA)的高吞吐量、低延迟推理。关键技术:PagedAttention:类似操作系统内存分页管理,将K...

国产开源之光【分布式工作流调度系统】:DolphinScheduler

DolphinScheduler是一个开源的分布式工作流调度系统,旨在帮助用户以可靠、高效和可扩展的方式管理和调度大规模的数据处理工作流。它支持以图形化方式定义和管理工作流,提供了丰富的调度功能和监控...

简单可靠高效的分布式任务队列系统

#记录我的2024#大家好,又见面了,我是GitHub精选君!背景介绍在系统访问量逐渐增大,高并发、分布式系统成为了企业技术架构升级的必由之路。在这样的背景下,异步任务队列扮演着至关重要的角色,...

虚拟服务器之间如何分布式运行?(虚拟服务器部署)

  在云计算和虚拟化技术快速发展的今天,传统“单机单任务”的服务器架构早已难以满足现代业务对高并发、高可用、弹性伸缩和容错容灾的严苛要求。分布式系统应运而生,并成为支撑各类互联网平台、企业信息系统和A...

一文掌握 XXL-Job 的 6 大核心组件

XXL-Job是一个分布式任务调度平台,其核心组件主要包括以下部分,各组件相互协作实现高效的任务调度与管理:1.调度注册中心(RegistryCenter)作用:负责管理调度器(Schedule...

京东大佬问我,SpringBoot中如何做延迟队列?单机与分布式如何做?

京东大佬问我,SpringBoot中如何做延迟队列?单机如何做?分布式如何做呢?并给出案例与代码分析。嗯,用户问的是在SpringBoot中如何实现延迟队列,单机和分布式环境下分别怎么做。这个问题其实...

企业级项目组件选型(一)分布式任务调度平台

官网地址:https://www.xuxueli.com/xxl-job/能力介绍架构图安全性为提升系统安全性,调度中心和执行器进行安全性校验,双方AccessToken匹配才允许通讯;调度中心和执...

python多进程的分布式任务调度应用场景及示例

多进程的分布式任务调度可以应用于以下场景:分布式爬虫:importmultiprocessingimportrequestsdefcrawl(url):response=re...

SpringBoot整合ElasticJob实现分布式任务调度

介绍ElasticJob是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目ElasticJob-Lite和ElasticJob-Cloud组成。它通过弹性调度、资源管控、...

分布式可视化 DAG 任务调度系统 Taier 的整体流程分析

Taier作为袋鼠云的开源项目之一,是一个分布式可视化的DAG任务调度系统。旨在降低ETL开发成本,提高大数据平台稳定性,让大数据开发人员可以在Taier直接进行业务逻辑的开发,而不用关...

SpringBoot任务调度:@Scheduled与TaskExecutor全面解析

一、任务调度基础概念1.1什么是任务调度任务调度是指按照预定的时间计划或特定条件自动执行任务的过程。在现代应用开发中,任务调度扮演着至关重要的角色,它使得开发者能够自动化处理周期性任务、定时任务和异...

取消回复欢迎 发表评论: