Authorization Code模式下OIDC中间件令牌交换及获取方式问询
先给你个明确结论:是的,处理signin-oidc的OIDC中间件会自动帮你把授权码兑换成access token和refresh token——这正是它的核心职责之一,完全不需要你手动调用RequestAuthorizationCodeTokenAsync来完成兑换操作。
1. 中间件的自动处理逻辑
当用户在身份提供商(IdP)那边完成验证后,会被重定向到你的signin-oidc端点,这时候中间件会自动完成以下步骤:
- 捕获IdP返回的授权码
- 向IdP的token端点发起请求,自动兑换出access token、refresh token以及id token
- 把这些令牌存储到你配置的认证方案中(通常是默认的Cookie认证)
2. 如何获取access token和refresh token
你可以通过HttpContext轻松获取这些令牌,常见场景的写法如下:
- 在控制器/ Razor页面中:
// 获取access token var accessToken = await HttpContext.GetTokenAsync("access_token"); // 获取refresh token var refreshToken = await HttpContext.GetTokenAsync("refresh_token"); - 在自定义中间件或授权策略中:
可以从AuthenticationProperties里提取,或者通过ClaimsPrincipal的扩展方法获取(ASP.NET Core 3.1及以上版本都支持上述GetTokenAsync方法)
需要注意:要确保你在OIDC配置中开启了令牌保存权限,并请求了offline_access scope,否则中间件不会保存refresh token。示例配置片段:
.AddOpenIdConnect("oidc", options => { options.SaveTokens = true; options.Scope.Add("offline_access"); // 其他IdP地址、客户端ID等配置... });
3. 什么时候需要手动实现?
只有当你不使用官方OIDC中间件,或者需要完全自定义令牌兑换、存储逻辑的时候,才需要自己实现重定向URL、捕获授权码并调用RequestAuthorizationCodeTokenAsync。但绝大多数业务场景下,官方中间件已经封装了所有通用逻辑,足够满足需求。
内容的提问来源于stack exchange,提问作者Zeid Shubailat
相关产品推荐
相关产品推荐

