C# ASP.NET Core 2.x google身份验证获取id\u令牌
我正在为我的asp.net mvc应用程序使用Google身份验证。 我将Google添加到Startup.cs类中: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
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状态丢失或无效。