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

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

liuian 2025-02-26 12:45 10 浏览

推送授权请求(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

相关推荐

x-cmd install | jellex - 用 Python 语法在终端里玩转 JSON 数据!

还在为命令行下处理JSON数据烦恼吗?jellex来了!它是一款基于终端的交互式JSON和JSONLines数据处理工具,让你用熟悉的Python语法,轻松过滤、转换和探索JSO...

一篇长文带你在Python里玩转Json数据

Json简介Json(JavaScriptObjectNotation)很多网站都会用到Json格式来进行数据的传输和交换,就像上篇我提到的网易云音乐接口,它们返回的数据都是Json格式的。这因为...

Python JSON 魔法手册:数据转换的终极艺术

对话实录小白:(崩溃)我从API拿到了JSON数据,怎么变成Python对象?专家:(掏出魔法书)用json模块,轻松实现数据转换!JSON基础三连击1.字符串Python对...

Python JSON 详解教程(python json())

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式(lightweightdatainterchangeformat)常用于Web应用、配置文件(co...

Python 数据的 JSON 格式序列化及反序列化

在Python中,将数据转换为JSON格式非常简单,可以使用内置的json模块。json模块提供了json.dumps()和json.dump()方法,用于将Python对象...

如何使Python类可JSON序列化(python json 类)

技术背景在Python开发中,JSON(JavaScriptObjectNotation)是一种常用的数据交换格式。然而,Python的json模块默认只能序列化一些基本数据类型,如字典、列表、字...

详细介绍一下Python如何对JSON格式数据进行处理?

在Python中对于JSON数据的处理是在日常开发中的常见需求之一。通常情况下,对JSON数据的处理主要涉及到如下的的几个步骤对于JSON数据的解析操作对于JSON数据的处理操作对于JSON数据的格式...

Python 字典l转换成 JSON(python转化字典)

本文需要5分钟。如果对您有用可以点赞评论关注.Python字典到JSONJSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它基于ECMAScrip...

打造熟悉的VS界面风格(vs界面设计美化)

用惯了老机子的VS界面,换新机子时,各种不适应。现在重新打造老款样式:1)下载VisualStudio2013ColorThemeEditorhttps://marketplace.vis...

办公小技巧:全部亮相 让Excel单元格完全显示文本

平时我们在使用Excel制作表格的时候,经常会遇到由于文本内容较多,导致这些内容无法在一个单元格中完全显示。常规的方法是将单元格设置为“自动换行”,但是这样会影响整个文件的美观。下例是某小区的入住登记...

WinForms 中的 CheckBox 控件使用指南

在WinForms中,CheckBox控件是一个允许用户选择或取消选择的单选按钮。它通常用于表示布尔值(真/假)或允许多选的情况。以下是如何使用CheckBox控件的一些基本信息和示例代码。创建...

图片转文字--四种OCR工具的安装和使用

本文仅测试简单的安装和使用,下一步应该是测试不同数据集下的检测准确率和检测效率,敬请期待。作者的系统环境是:笔记本:ThindPadP520OS:win11显卡:QuadroP520一、EasyO...

C# 给Word每一页设置不同图片水印

Word中设置水印时,可加载图片设置为水印效果,但通常添加水印效果时,会对所有页面都设置成统一效果,如果需要对每一页或者某个页面设置不同的水印效果,则可以参考本文中的方法。下面,将以C#代码为例,对W...

集成的面向对象控件Xtreme Controls正式发布v17.0.0

CodejockXtremeControls为Windows图形用户软件工程师提供众多的有关MFC的控件产品,该产品是通过完全测试并专门为图形用户设计的一款专业控件。它是一款集成了面向对象的控件被...

Win10 Build 10061老问题修复新问题来

|责编:刘菲菲【中关村在线软件资讯】4月23日消息:微软今天正式推送了Windows10Build10061预览版这个版本除了正常的功能更新和调整外,还修复了多个bug。其中一部分对于开发者开...