我已设置Google OAuth
我已将代码添加到Startup.Auth.cs
中 app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
{
// LRC
ClientId = "xxxxxxxxx",
ClientSecret = "xxxxx"
//CallbackPath = new PathString("/signin-google")
});
但在我选择使用Google帐户登录后,它又将我重定向到了登录页面,
我通过Chrome检查了网络,发现访问被拒绝了。
http://www.liferunningclub.com.au/Account/ExternalLoginCallback?error=access_denied
我无法理解。
请帮忙。谢谢。
更新 现在我做了别的事: 1.我在帐户控制器上添加了一个注释([RequireHttps]) 2.我为我的项目启用了SSL。 2.我更新了网址并将Google控制台中的网址重定向到https
尝试使用Google登录后,在我选择了我的Google帐户后,它返回了相同的access_denied。
如果Google的回复可以提供更详细的信息会更好。
答案 0 :(得分:26)
使用最新的ASP.Net MVC模板和#34;个人帐户"我遇到了同样的问题。地选择。
解决方案是在Google Developer Console中为我的项目启用Google+ API。
我找到了答案here(向下滚动到"对Google OAuth 2.0的更改......")。
答案 1 :(得分:3)
Facebook提供商也发生了同样的错误。
事实证明解决方案就像updating the nuget package to 3.1一样简单。
事实证明,Facebook对其图谱API进行了“强制升级” 2017年3月27日从2.2版到2.3版
对于记录我正在使用以下内容:
在Facebook中,我为测试应用程序配置了以下设置:
此外,如果您使用的是示例模板,则不会消耗返回的error
参数,这可能会产生误导。您应该将string error
添加到ExternalLoginCallback
[AllowAnonymous]
public async Task<ActionResult> ExternalLoginCallback(string returnUrl, string error)
{
if (error != null)
{
return View("Error");
}
答案 2 :(得分:1)
我也有这个问题。启用Google+ API后,问题仍未解决。事实证明,我还没有设定授权的JavaScript来源&#39;在我的谷歌API控制台中。所以我设置了authorized javascript origins,问题就解决了。
答案 3 :(得分:1)
我有同样的问题。我启用了Google+ API,并设置了JavaScript提供程序。原来我的Microsoft.Owin 3.1版本太旧了。我已经更新了每个带有Microsoft.Owin(无论如何)名称的块,并且它可以正常工作(4.1版)
希望有帮助!
答案 4 :(得分:0)
这很可能是因为您尚未在开发者控制台中启用Google + API。
因此,当您的帐户尝试获取有关Google帐户的详细信息时,它会显示access_denied
。
只需转到开发者控制台并启用Google + API
答案 5 :(得分:0)
以上解决方案均不适合我。事实证明,在我的情况下,我正在对Google OAuth Playground
进行调整,并在我的“用于客户ID和机密的Google凭据”的“授权重定向Uris”部分中添加了https://developers.google.com/oauthplayground这个网址。
当我删除并重试它时,它工作正常。
PS:我还必须重置也修改过的OAuth Playground
设置。
编辑
另一个问题是,当用户Exception
被触发时,我的代码抛出了OnAthenticated EventHandler
。产生一个空引用,导致返回access_denied
状态。
GoogleOAuth2AuthenticationOptions googleOptions = new GoogleOAuth2AuthenticationOptions()
{
ClientId = "xxxxx.apps.googleusercontent.com",
ClientSecret = "XXXX",
Provider = new GoogleOAuth2AuthenticationProvider()
{
OnAuthenticated = (context) =>
{
try
{
TokenHelper tokenHelper = new TokenHelper();
// Any exception here will result in 'loginInfo == null' in AccountController.ExternalLoginCallback.
// Be sure to add exception handling here in case of production code.
context.Identity.AddClaim(new Claim(tokenHelper.AccessToken, context.AccessToken)); // From This line and onwards. tokenHelper's properties were null.
// For clarity, we don't check most values for null but RefreshToken is another kind of thing. It's usually
// not set unless we specially request it. Typically, you receive the refresh token only on the initial request,
// store it permanently and reuse it when you need to refresh the access token.
if (context.RefreshToken != null)
{
context.Identity.AddClaim(new Claim(tokenHelper.RefreshToken, context.RefreshToken));
}
// We want to use the e-mail account of the external identity (for which we doing OAuth). For that we save
// the external identity's e-mail address separately as it can be different from the main e-mail address
// of the current user.
context.Identity.AddClaim(new Claim(tokenHelper.Email, context.Email));
context.Identity.AddClaim(new Claim(tokenHelper.Name, context.Name));
context.Identity.AddClaim(new Claim(tokenHelper.IssuedOn, DateTime.Now.ToString()));
context.Identity.AddClaim(new Claim(tokenHelper.ExpiresIn,
((long)context.ExpiresIn.Value.TotalSeconds).ToString()));
return Task.FromResult(0);
}
catch (Exception ex)
{
throw;
}
},
},
AccessType = "offline",
UserInformationEndpoint= "https://www.googleapis.com/oauth2/v2/userinfo"
};
答案 6 :(得分:0)
默认的Google身份验证不再起作用,您可以通过NuGet添加更新的Owin.Security.Provider.Google程序包或找到它here