我在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?
答案 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.