OWIN的GetExternalLoginInfoAsync总是返回null
我创build了一个新的MVC5 Web应用程序,当我尝试使用Google或Facebooklogin时, AccountController
的ExternalLoginCallback
Action被调用,但GetExternalLoginInfoAsync()
总是返回null:
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null) { return RedirectToAction("Login"); }
由于它始终为空,它只是redirect到login页面,并且过程重新开始。 我怎样才能解决这个问题?
要让OWIN Googlelogin在标准的Visual Studio 2013,ASP.Net MVC5网站上正常工作,我必须:
1)通过https://console.developers.google.com/project设置Google OpenId帐户
2)将callbackURL设置为blah / signin-google。 关于你不需要做的事情的重要说明:
-
您不需要使用HTTPSredirectGoogle; 你甚至可以redirect回原来的http:// localhost ,没问题。
-
您不需要为redirectURL设置任何内容–Web.Config中没有路由,控制器操作或特殊权限。 redirectURL总是/ signin-google,OWIN在幕后为您处理。
举例来说,如果您的网站是me.com,那么您可能会在Google Developer Console中使用这3个callbackurl:
http://localhost:53859/signin-google http://test.me.com/signin-google https://me.com/signin-google
第一个包括VS给你的项目的端口号。
3) 启用Google+ API 。 这是一个隐藏的问题,是问题的根本原因在这里 – 如果你不这样做,很容易错过Request /account/ExternalLoginCallback
包括&error=access_denied
,这是因为Google对OWIN为用户的Google+基本个人资料所做的权限请求表示不同意。 我不知道这是谁,谷歌或微软的错。
要在开发者控制台中启用Google+ API,请点击左侧的API,searchGoogle+,然后点击启用。 是的,你确实需要这样做。 如果你没有这样做,你会感到困惑。
4)将Google ClientId和ClientSecret添加到开发者控制台中的Startup.Auth中,但改进过程中的代码以明确使用OAuth2,并明确要求用户的电子邮件地址:
var google = new GoogleOAuth2AuthenticationOptions() { ClientId = "123abc.apps.googleusercontent.com", ClientSecret = "456xyz", Provider = new GoogleOAuth2AuthenticationProvider() }; google.Scope.Add("email"); app.UseGoogleAuthentication(google);
而已。 终于有了它的工作。
只是想重申一次,关于这个和OWIN / Google不工作的问题有很多答案,而且几乎所有这些都是当前VS2013 / MVC5 / OWIN模板的错误。 你根本不需要修改Web.Config。 你不需要创build任何特殊的路线。 您不应该尝试将/ signin-google指向另一个地方,或者使用不同的callbackURL,并且您绝对不应该尝试将其直接绑定到/ account / externallogincallback或externalloginconfirmation,因为这些都与/ signin-谷歌和OWIN /谷歌进程中的必要步骤。
好的,我发现它为什么是空的。 您必须在Google控制台中启用Google + API。 在将其粘贴到代码后,还要确保密钥不与最后一个空格连接。 为什么他们不能返回一个正常的错误? 我不知道。
看来,Nuget软件包Microsoft.Owin.Security.Facebook版本3.0.1不再适用于Facebooklogin。
将这个包更新到预发行版本3.1.0,您可以使用以下内容:
安装程序包Microsoft.Owin.Security.Facebook-Pre
正如其他人正确提到的,大部分时间,这是因为你没有权限的Google+ API,所以这里是如何获得在谷歌APIpipe理器的项目的权限到Google+ API
第1步:从顶部的combobox中select您的项目,并转到仪表板>启用API
第2步:searchGoogle plus并select它
第3步:启用它!
如果您返回到该项目的仪表板,则可以在底部看到该项目的启用API列表
这解决了我的问题:
启用Google+ API。 这是一个问题,是问题的根本原因在这里 – 如果你不这样做,很容易错过Request /account/ExternalLoginCallback
包括&error=access_denied
,这是因为谷歌说不对权限请求OWIN针对用户的Google+基本个人资料进行的。 我不知道这是谁,谷歌或微软的错。
要在开发者控制台中启用Google+ API,请点击左侧的API,searchGoogle+,然后点击启用。
我通过简单地更新应用程序中的所有块体包来工作,它工作。
我知道这是愚蠢的,但经过漫长的斗争,重新启动IIS解决了我的问题。
我做了以下工作。
login到开发人员门户,find您的应用程序并执行以下操作。
应用程序详细信息>以应用程序为中心的平台>为网站select是
我今天遇到这个问题,事实certificate,我定义了远程cookie后,我分配的提供者。
确保你放置…
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
之前…
app.UseFacebookAuthentication( appId: "", appSecret: "");
虽然上面的答案都很好,但在我的例子中,没有一个能够工作 – 我查了一下,并仔细检查了Google的设置,并同意Chris Moschini说有很多误导性的信息。
对我来说,当我意识到我的Out of Process 状态服务没有启动时,这是一个'doh时刻! 没有错误(因为login是我重新启动后,在状态服务设置为手动启动在机器上的第一件事)只是从GetExternalLoginInfoAsync
希望这可以帮助别人。
经过多次search和头部划伤以及在Stackoverflow上的众多红鲱鱼答案后,我最终在我的Google开发控制台上查看了所有选项,并在Google + API概述页面上发现了一个蓝色的[启用]button。 我点了这个,嘿,它工作。 忘记所有关于callbackurl和路由configuration的读取的baloney,在任何情况下,OWIN都会覆盖google默认的/ signin-googleredirect的uri,然后把你发回到ExternalLoginCallback。 只要坚持使用默认实现,只要启用Google + API,所有这一切都会很好。
我也想为这个贡献。 我刚刚得到这个工作。 我有问题的GetExternalLoginInfoAsync返回null,但只在生产。
经过大量的search,我终于find了答案,这只是我的数据库的一个问题。 在生产中,我设置了错误的连接string,所以它不能正确连接,但基本上没有提到。 唯一发生的事情是GetExternallLoginInfoAsync返回null。 所以检查你的数据库连接string,如果这发生!
另外在旁注中,唯一需要做的工作是:
- 在Google控制台中设置一个项目
- 启用Google+ API
- 将您的客户端ID和客户端密钥复制到Startup.Auth.cs文件。
您不必启用HTTPS,就不必创build自定义路由。 但请确保您的数据库正常工作!
所有其他的答案并没有解决这个问题,所以如果你在同一条船上,那么确保你的注册控制器动作具有RequireHttps属性:
// GET: /Account/LoginRegister [AllowAnonymous] [RequireHttps] public ActionResult LoginRegister() { return View(new RegisterLoginViewModel()); }