我正在尝试在我的外部提供程序OAuth访问令牌到期后对其进行续订。用户最初使用外部提供程序登录后,它们便通过登录管理器存储在我的SQL数据库中。
服务器使用访问令牌代表用户发出请求(主要是从现在开始用某些外部提供程序信息更新我的数据库)。
我正在使用带有内置Identity Server的.NETCore 3 Preview-6 Angular入门项目(我意识到这是一个预览-但我认为我的问题更多与缺乏了解什么有关我应该做的!)。使原始外部登录正常工作(使用.AddAuthentication().AddOAuth(...)
)并没有太大的麻烦。
但是,当我使用提供的访问令牌的服务收到401响应时,我无法确定如何让我的服务器为用户静默地更新访问令牌。
我已尝试在控制器上使用[Authorize(AuthenticationSchemes = "MyScheme")]
,但这使外部提供程序响应时出现了CORS错误。然后,我在服务中尝试了HttpContext.ChallengeAsync(...)
,但那似乎根本没有用(也许这与.NETCore的预览版有关?)。
我什至尝试重新创建返回new ChallengeResult(...)
的脚手架代码,但是当从我的API中调用时,我遇到了同样的CORS错误。 (我不确定这里发生了什么不可思议的事情,以使请求像推荐人是外部提供者一样出现。)
TL; DR (代码段)
理想情况下,我正在尝试使// TODO
部分起作用:
// This code is inside a Service I have which is called by a Controller action
var user = await _userManager.GetUserAsync(_httpContextAccessor.HttpContext.User);
var accessToken = await _userManager.GetAuthenticationTokenAsync(user, "MyScheme", "access_token");
_client.SetBearerToken(accessToken);
var response = await _client.GetAsync($"{uri}?{_query.ToString()}");
if (!response.IsSuccessStatusCode) // Just assuming 401 for simplicity
{
// TODO: renew the access token and try again
}
我希望重新获得更新的访问令牌,可以用来重新执行请求。理想情况下,这将是静默续订,或者如果请求的外部访问已更改,则将进行重定向。
希望这很有意义,如果您需要更多信息,请告诉我。
谢谢