问题描述
我有一个使用授权代码流进行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>>