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

时间:2018-08-08 17:51:51

标签: c# authentication asp.net-core google-oauth

我在asp.net mvc应用程序中使用Google身份验证。 我将Google添加到了Startup.cs类中:

id

我可以使用以下方法从控制器获取access_token:

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;
});

我需要id_token来验证我的自定义后端应用程序,例如this。 我尝试使用此代码,但得到空值。

var token = await HttpContext.GetTokenAsync("access_token").ConfigureAwait(false);

是否有可能以某种方式获取id_token?

2 个答案:

答案 0 :(得分:0)

默认情况下,Google authentication implementation uses response_type=code。有了这个流程,您将没有id_token的回应。要拥有它,response_type应该是response_type=code id_token(来自here)。

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

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

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

答案 1 :(得分:0)

最适合我的解决方案。

 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。

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

  

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

在这里,我们可以添加其他支票,例如:idp != Google.