使用授权代码,拦截signin-oidc的中间件是否将访问令牌的授权代码交换了?还是必须以编程方式执行此操作?如果中间件做到了,那我能找到访问和刷新令牌吗?
还是我必须实现自己的重定向URL和代码并捕获返回的代码,并使用RequestAuthorizationCodeTokenAsync与访问令牌进行交换?
答案 0 :(得分:0)
否,您不必实现部分即可获取由处理程序处理的令牌,但是您需要回调来处理登录,存储声明并创建登录。这是如何获取访问令牌的原始示例:
编辑
我将以Google为例,因为我手边有代码,但是IdentityServer OAuth应该相同,因为它们扩展了OAuthHandler。
services.AddAuthentication(options =>
{
//Add your identity Server schema etc
})
.AddGoogle(options =>
{
options.SaveTokens = true;
options.ClientId = Configuration["Google:ClientId"];
options.ClientSecret = Configuration["Google:ClientSecret"];
})
在身份验证控制器中:
[HttpPost("ExternalLogin")]
[AllowAnonymous]
public IActionResult ExternalLogin(string provider, string returnUrl = null)
{
var redirectUrl = Url.Action(nameof(ExternalLoginCallback), "Account", new { returnUrl });
var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl);
return Challenge(properties, provider);
}
[HttpGet("ExternalLoginCallback")]
[AllowAnonymous]
public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null)
{
if (remoteError != null)
{
throw new Exception($"Error from external provider: {remoteError}");
}
var info = await _signInManager.GetExternalLoginInfoAsync();
if (info == null)
{
//It throws here, since there are no tokens
throw new Exception("Error: could not find user tokens");
}
//Handle the rest of authentication
}
会发生什么?您有一个按钮指向您的外部登录提供程序“ Google”作为提供程序。
您将重定向到Google登录页面,然后登录。
Google服务器使用授权码将您重定向回您的域和/ google-signin(默认隐藏在句柄中)
然后,Google处理程序将授权码与您的秘密一起使用以获取令牌
如果您指定保存令牌,则将在OAuth选项中保存响应中的令牌。以及从用户信息端点获得的一些基本声明。
然后,您将重定向到外部登录回调:
_signInManager.GetExternalLoginInfoAsync();
将获取保存的令牌。
所以回答您的问题。处理程序将负责保存令牌(如果您指定的话)。如果需要,您可以从signInManger中获取它们。