对我来说,我虽然很旧,但正在将.NET 4.6.1 MVC网站迁移到核心1.1。在我将其恢复之前,工作停止了,然后才将其备份,然后迁移到2.x。
我的问题是来自Google的回调与404
我网站上的会面。我以为应该击中AccountController.ExternalLoginCallback
所以我添加了一个[Route(...)]
给它,果然,谷歌的回调成功了。
然后null
按此行中返回的内容(什么样的疯子会返回null
??)
var externalLoginInfo = await this.SignInManager.GetExternalLoginInfoAsync();
我对其进行了反向工程,以发现其最终获得处理程序的机会 ExternalScheme
对我来说是cookie处理程序!
一切似乎都错了,我觉得中间件应该以某种方式截获回调URI,所以我删除[Route(...)]
了404
问题又回来了。
然后,我发现我需要在启动过程中添加它。
applicationBuilder.UseAuthentication();
这解决了404
问题,但又提出了另一个问题。
没有指定authenticationScheme,也没有找到DefaultSignInScheme。
通过在此处添加默认方案,我可以解决上述错误。
serviceCollection.AddAuthentication(IdentityConstants.ExternalScheme)
.AddGoogle(googleOptions => Configuration.Bind("OAuth2:Providers:Google", googleOptions))
.AddExternalCookie();
现在AccountController.ExternalLoginCallback
被一些魔术再次调用,但是我回到了null
返回值。
我将此代码添加到了令人反感的行上方,这实际上是幕后发生的事情(查看GitHub上的Microsoft代码)。有趣的是,h
它是类型CookieAuthenticationHandler
,a
并且我的所有主张和信息都来自Google!
var authHandler = this.HttpContext.RequestServices.GetRequiredService<IAuthenticationHandlerProvider>();
var h = await authHandler.GetHandlerAsync(this.HttpContext, IdentityConstants.ExternalScheme);
var a = await h.AuthenticateAsync();
var externalLoginInfo = await this.SignInManager.GetExternalLoginInfoAsync();
进入GitHub并将其内部代码粘贴到我的控制器中,我可以发现它ClaimTypes.NameIdentifier
在我的声明中找不到,ProviderKey
稍后将使用。
嗯...
有关我正在使用旧的1.x AccountController
带有更新的2.x标识位的代码,所以我确实找到了一些仍在使用这些东西的示例,以及一些同样使用Razor页面的示例。我将继续我所拥有的。
因此,我接下来将研究将其他Google用户JSON有效负载项映射到声明中。我认为,如果我的Google帐户ID(我想是数字)已映射,那么一切都会正常。
https://docs.microsoft.com/zh-cn/aspnet/core/security/authentication/social/additional-claims?view=aspnetcore-2.2
最终修复
最后,我添加了“声明操作”以将我的Google标识符从Google传回的JSON中拉出来,从而解决了该问题!
serviceCollection.AddAuthentication(IdentityConstants.ExternalScheme)
.AddGoogle(googleOptions =>
{
Configuration.Bind("OAuth2:Providers:Google", googleOptions);
googleOptions.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "sub", "string");
})
.AddExternalCookie();
该sub
字段包含在什么最终结束了nameidentifier
要求,然后进入ProviderKey
了AccountController
希望。