如何在连接到Azure AD B2C的Blazor服务器端应用程序中实现静默ID令牌续订?

问题描述

我有一个使用授权代码流进行Azure AD B2C身份验证的Blazor服务器端应用程序。在用户登录时,应用成功为用户检索ID令牌,访问令牌和刷新令牌。所有令牌都存储在授权cookie中。

当前,该应用会定期在自定义ValidateAuthenticationStateAsync的{​​{1}}中验证ID令牌。提供者获得RevalidatingServerAuthenticationStateProvider声明,并验证令牌是否已过期。如果到期,提供者只需返回exp,这将导致用户被注销。

我宁愿对ID令牌执行无提示续订/刷新,而不是用户注销。我已经尝试使用现有的解决方案(带有某些HTTP请求的隐藏的iframe),例如Task.Fromresult(false);,但这里对oidc-client端点的第一个请求使用的是/authorize,而B2C则是not supported页面始终显示在隐藏的iframe中。

如何在不从头开始实施所有操作的情况下执行此操作?我可以使用现有的解决方案吗?

解决方法

在Azure AD B2C中使用授权代码流时,应将刷新令牌发送到/token终结点(https://docs.microsoft.com/en-us/azure/active-directory-b2c/tokens-overview#endpoints)。您正在使用的库应该是自动执行的,或者您必须通过调用/token端点来完成它,如下所示:

POST https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/oauth2/v2.0/token HTTP/1.1

Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token&client_id=90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6&scope=90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6 offline_access&refresh_token=<<REFRESH-TOKEN>>