为了账号安全,请及时绑定邮箱和手机立即绑定

ASP.NET Core 2.x google 身份验证获取 id_token

ASP.NET Core 2.x google 身份验证获取 id_token

C#
三国纷争 2021-11-21 10:12:58
我正在为我的 asp.net mvc 应用程序使用 Google 身份验证。我将 Google 添加到我的 Startup.cs 类中:services.AddAuthentication(options =>{    options.DefaultAuthenticateScheme = GoogleDefaults.AuthenticationScheme;    options.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme;}).AddGoogle(googleOptions =>{    googleOptions.ClientId = _configuration["Authentication:Google:ClientId"];    googleOptions.ClientSecret = _configuration["Authentication:Google:ClientSecret"];    googleOptions.SaveTokens = true;});我可以使用这个从控制器获取 access_token:var token = await HttpContext.GetTokenAsync("access_token").ConfigureAwait(false);我需要 id_token 像这样对我的自定义后端应用程序进行身份验证。我尝试使用此代码,但结果为空。var token = await HttpContext.GetTokenAsync("id_token").ConfigureAwait(false);是否有可能以某种方式获得 id_token?
查看完整描述

2 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

默认情况下,Google 身份验证实现使用response_type=code. 有了这个流程,你就没有id_token回应了。拥有它,response_type应该是response_type=code id_token(从这里)。

您可以BuildChallengeUrl在派生YourGoogleHandler类中覆盖该方法,并将 DI 注册从 更改.AddGoogle()

.AddOAuth<GoogleOptions, YourGoogleHandler>
  (GoogleDefaults.AuthenticationScheme, GoogleDefaults.DisplayName, googleOptions)

(代码取自Microsoft.AspNetCore.Authentication.Google/GoogleExtensions.cs


查看完整回答
反对 回复 2021-11-21
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

对我有用的解决方案..


 services.AddAuthentication()

           .AddOpenIdConnect(GoogleDefaults.AuthenticationScheme,

               GoogleDefaults.DisplayName,

               options =>

               {

                   options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;

                   options.Authority =  "https://accounts.google.com";

                   options.ClientId = googleOAuthSettings.ClientId;

                   options.ClientSecret = googleOAuthSettings.ClientSecret;

                   options.ResponseType = OpenIdConnectResponseType.IdToken;

                   options.CallbackPath =  "signin-google";

                   options.SaveTokens = true; //this has to be true to get the token value

                   options.Scope.Add("email");

               });

Google OAuth 的 OpenIdConnect 提供程序允许我们自定义 ResponseType。


根据链接,OpenIdConnectHandler 似乎实现了 IAuthenticationSignOutHandler。所以这就是为什么无论发现文档中有什么(支持或不支持结束会话端点),如果您使用 AddOpenIdConnect(...),它将始终注册一个看似支持注销的处理程序。如果您正在使用任何 IdentityServer4 快速入门,那么您可以通过检查 AccountService.cs --> BuildLoggedOutViewModelAsync 方法中的条件来消除该错误。


var providerSupportsSignOut = await _httpContextAccessor.HttpContext.GetSchemeSupportsSignOutAsync(idp)


在这里,我们可以添加额外的检查,如: idp != Google.


查看完整回答
反对 回复 2021-11-21
  • 2 回答
  • 0 关注
  • 213 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信