C# ASP.NET Core 2.x google身份验证获取id\u令牌

C# ASP.NET Core 2.x google身份验证获取id\u令牌,c#,authentication,asp.net-core,google-oauth,C#,Authentication,Asp.net Core,Google Oauth,我正在为我的asp.net mvc应用程序使用Google身份验证。 我将Google添加到Startup.cs类中: services.AddAuthentication(options => { options.DefaultAuthenticateScheme = GoogleDefaults.AuthenticationScheme; options.DefaultChallengeScheme = GoogleDefaults.AuthenticationSche

我正在为我的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;
});
我可以使用以下方法从控制器获取访问令牌:

var token = await HttpContext.GetTokenAsync("access_token").ConfigureAwait(false);
我需要id_令牌来验证我的自定义后端应用程序,如。 我尝试使用此代码,但结果为空

var token = await HttpContext.GetTokenAsync("id_token").ConfigureAwait(false);
是否可以以某种方式获取id\u令牌?

默认情况下。使用此流,您没有响应的
id\u令牌
。要拥有它,
response\u type
应该是
response\u type=code-id\u-token
(from)

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

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

(代码取自对我有效的解决方案。)

 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提供程序允许我们自定义响应类型

根据OpenIdConnectHandler,它似乎实现了IAAuthenticationSignOutHandler。这就是为什么无论发现文档中有什么内容(是否支持结束会话端点),如果使用AddOpenIdConnect(…),它将始终注册一个似乎支持注销的处理程序。如果您使用的是任何IdentityServer4 quick start,则可以通过检查AccountService.cs-->BuildLoggedOutViewModelAsync方法中的条件来消除该错误

var providerSupportsSignOut=等待 _httpContextAccessor.HttpContext.GetSchemeSupportsSignOutAsync(idp)


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

您是否检查了id\u令牌是否由Google发送?顺便说一句,我尝试了您的解决方案,但从Google收到一个错误,即nonce缺失,因此添加了以下内容:
queryStrings.add(“nonce”,Guid.NewGuid().ToString(“N”))现在我得到一个异常:
异常:oauth状态丢失或无效。