我如何从外部提供商那里获得新的OAuth访问令牌

时间:2019-07-04 04:23:18

标签: c# .net-core identityserver4

我正在尝试在我的外部提供程序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
}

我希望重新获得更新的访问令牌,可以用来重新执行请求。理想情况下,这将是静默续订,或者如果请求的外部访问已更改,则将进行重定向。

希望这很有意义,如果您需要更多信息,请告诉我。

谢谢

0 个答案:

没有答案