OWIN的GetExternalLoginInfoAsync始终返回null


69

我创建了一个新的MVC5 Web应用程序,当我尝试使用Google或Facebook登录时,会调用中的ExternalLoginCallbackAction AccountController,但是GetExternalLoginInfoAsync()始终返回null:

var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
if (loginInfo == null)
{
    return RedirectToAction("Login");
}

因为它始终为null,所以它仅重定向回到登录页面,然后过程重新开始。我怎样才能解决这个问题?


看一下:asp.net/mvc/tutorials/mvc-5/…。我昨天没问题就遵循了它
Felipe Miosso

您是否检查了是否将正确的提供程序传递给ExternalLogin ActionResult的ChallengeResult?
桑托什

2
遇到同样的问题。是的,提供者是正确的。我单击登录,将我重定向到facebook,然后登录,然后将我重定向到该方法...,其中包含一个空的loginInfo。
nVentimiglia

1
遇到同样的问题。重新启动IIS后,它可以解决此问题。这个问题有适当的解决方案吗?

7
我遇到了同样的问题,我忘了打开Goog​​le + API
sabotero,2014年

Answers:


105

为了使OWIN Google登录在标准Visual Studio 2013 ASP.Net MVC5网站上正常运行,我必须:

  1. 通过https://console.developers.google.com/project设置Google OpenId帐户

  2. 将回调URL设置为blah/signin-google
    对事物的重要提示你没有需要做的:

    • 您无需使用HTTPS进行Google重定向回;您甚至可以重定向回普通的http:// localhost,没问题。

    • 您不需要为重定向URL设置任何内容-Web.Config中没有路由,控制器操作或特殊权限。重定向URL始终是/ signin-google,OWIN会在后台为您处理。

例如,如果您的网站是me.com,则您可能在Google Developer Console中拥有以下3个回调URL:

http://localhost:53859/signin-google
http://test.me.com/signin-google
https://me.com/signin-google

第一个包括VS给您的项目提供的端口号。

  1. 启用Google+ API。这是一个隐藏b ****一个疑难杂症的,是问题的问题的根源在这里-如果你不这样做,很容易错过的请求/account/ExternalLoginCallback包括&error=access_denied,这是因为谷歌说不OWIN针对用户的Google+基本个人资料提出了权限请求。我不知道这是谁的错,是谷歌还是微软。

要在开发者控制台中启用Google+ API,请点击左侧的API,寻找Google+,然后点击并点击启用。是的,您确实需要这样做。如果您不这样做,就会被水淹。

  1. 将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。
您无需创建任何特殊的路线。
您不应该尝试指向/signin-google其他位置或使用其他回调URL,并且绝对不应该尝试将其直接绑定到/account/externallogincallbackexternalloginconfirmation,因为它们既与/signin-googleOWIN / Google流程分离又是必不可少的步骤。


11
第三为我做到了。可悲的是,我知道过去这是问题所在,但忘记了……是的,完全同意这是绝对的。非常感谢您的清单。
roboto1986

4
谢谢你,谢谢你,谢谢你!有效,可以,启用Google+ API,即使没有“代码改进”也可以正常工作。非常详细的答案!
Pawel Cioch 2015年

1
如果我能支持你一千次,我会的。谢谢!
Giovanni Galbo

4
对我不起作用。如果不启用Google+ API,实际上是不可能创建appID和appSecret的。我已启用它并能够创建机密和ID,但仍将我重定向回登录页面。
tutiplain

2
我启用了它,但仍然无法正常工作。我正在考虑手动执行Oauth流程,因为这似乎是Owin或Visual Studio中的项目模板中的错误。
tutiplain

46

好的,我发现了为什么它为空。您必须在Google控制台中启用Google + API。另外,在将私钥粘贴到代码中之后,请确保私钥末尾没有空格。他们为什么不能返回正常错误?我不知道。


6
这立即解决了问题。好发现,谢谢。
詹姆斯·莫尔丁

现在,我仔细查看,发现在asp.net上的说明中清楚地指示了此步骤。
詹姆斯·莫尔丁

是的,但我认为这不是强制性的。无论如何,与所显示的错误之间的联系尚不清楚。
Ronen Festinger

是的,我已经看到各种疯狂的答案,但这对我来说是正确的答案。
勃艮第爸爸

先生,你是神!
克里斯(Kris)

19

似乎Nuget包Microsoft.Owin.Security.Facebook版本3.0.1不再与Facebook Login一起使用。

将此程序包更新为预发行版本3.1.0,可以使用以下命令:

安装包Microsoft.Owin.Security.Facebook -Pre


今天也刚好碰到了这个问题,更新到3.1.0的RC也对我有用。
克里斯·塞尔斯

很高兴为您提供了帮助:)
路加福音

2
Crikey,希望他们能尽快解决这个问题,整夜整晚重新配置URL,以尝试找出自上次玩游戏以来我无意中更改的内容。您的建议有效。根据NuGet的说明,以后仍没有安装3.0.1的更新版本
理查德

1
在尝试了几乎所有堆栈溢出问题并浪费了大约3个小时之后,这是我的最终解决方案。谢谢:)
丹·库克

1
升级到3.1解决了我的问题。感谢您为我节省了许多调试时间!
johnnyRose17年

7

正如其他人正确提到的,多数情况下,这是因为您没有对Google+ API的许可,因此这是如何在Google API Manager中获得对Google+ API的项目的许可

步骤1.从顶部的组合框中选择“您的项目”,然后转到“仪表板”>“启用API” 在此处输入图片说明

第2步:搜索Google plus并将其选中 在此处输入图片说明

第三步:启用它! 在此处输入图片说明

如果返回该项目的仪表板,则可以在底部看到该项目的已启用API的列表 在此处输入图片说明


4

通过简单地更新应用程序中的所有块模块包,我就可以正常工作。


在尝试了这里提到的所有其他内容之后,这对我也起作用。我将OWIN软件包从v4.0.0更新到了v4.0.1,然后开始工作。
christiaantober

3

我知道这很愚蠢,但是经过长时间的努力,重新启动IIS为我解决了这个问题。


同样在这里,但一段时间(几天)后问题又回来了。它在一段时间内运行良好,然后突然停止,刷新应用程序池再次解决了该问题。很奇怪。
Patrick

这为我解决了这个问题。希望它现在可以继续工作。stackoverflow.com/a/20948631/155758
Patrick

3

这解决了我的问题:

启用Google+ API。这是一个棘手的问题,也是这里问题的根本原因-如果您不这样做,很容易错过Request to /account/ExternalLoginCallbackincludes &error=access_denied,这是因为Google拒绝了OWIN为用户的权限请求Google+基本个人资料。我不知道这是谁的错,是谷歌还是微软。

要在开发者控制台中启用Google+ API,请点击左侧的API,寻找Google+,然后点击并点击启用。


1

我做了以下工作。

登录到开发人员门户,找到您的应用程序并执行以下操作。

应用程序详细信息>以应用程序为中心的列出平台>网站选择是


1

我今天遇到了这个问题,结果发现我在分配了提供程序之后定义了远程cookie。

确保放置...

app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

之前...

app.UseFacebookAuthentication(
                   appId: "",
                   appSecret: "");

1

对于那些正在遇到此问题的Web Api。其他解决方案也无助于 AuthenticationManager.GetExternalLoginInfoAsync();即使启用了Google Plus API也始终返回null。

使用此自定义函数获取logininfo。显然,通过Web API请求时,Microsoft对于GetExternalLoginInfoAsync有一个错误。

private async Task<ExternalLoginInfo> AuthenticationManager_GetExternalLoginInfoAsync_WithExternalBearer()
        {
            ExternalLoginInfo loginInfo = null;

            var result = await Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ExternalBearer);

            if (result != null && result.Identity != null)
            {
                var idClaim = result.Identity.FindFirst(ClaimTypes.NameIdentifier);
                if (idClaim != null)
                {
                    loginInfo = new ExternalLoginInfo()
                    {
                        DefaultUserName = result.Identity.Name == null ? "" : result.Identity.Name.Replace(" ", ""),
                        Login = new UserLoginInfo(idClaim.Issuer, idClaim.Value)
                    };
                }
            }
            return loginInfo;
        }

1
谢谢,这解决了我的问题。微软需要研究这个错误
Samuel Moshie

0

尽管上面的答案都很好,但在我看来,这些都没有用-我检查并再次检查了Google设置,并同意Chris Moschini的说法,其中存在许多误导性信息。

对我来说,这是一个'doh时刻,我意识到我的Out of Process 状态服务没有启动!没有错误(因为登录是重启后我尝试的第一件事,其中状态服务设置为在计算机上手动启动)只是GetExternalLoginInfoAsync

希望这可以帮助其他人。


0

经过大量搜索和抓挠,并在Stackoverflow上获得了很多红鲱鱼答案之后,我最终浏览了Google开发人员控制台上的所有选项,并在Google + API概述页面上发现了一个蓝色的[启用]按钮。我单击了此按钮,然后嘿,它起作用了。忘记所有有关回调URL和路由配置的信息,OWIN无论如何都将覆盖Google默认的/ signin-google redirect uri,并将您发送回ExternalLoginCallback。只要启用默认的实现,只要启用了Google + API,一切都会很好。


0

我也想为此做出贡献。我最近才开始工作。我遇到了GetExternalLoginInfoAsync返回null但仅在生产环境中的问题。

经过大量搜索,我终于找到了答案,这仅仅是我的数据库存在的问题。在生产中,我设置了错误的连接字符串,因此它无法正确连接,但对此基本上保持沉默。唯一发生的是GetExternallLoginInfoAsync返回null。因此,如果发生这种情况,请检查数据库连接字符串!

同样在一个旁注中,要使该工作正常进行,唯一需要做的是:

  • 在Google控制台中设置项目
  • 启用Google+ API
  • 将您的客户端ID和客户端密钥复制到Startup.Auth.cs文件。

您不必启用HTTPS,也不必创建自定义路由。但是,请确保您的数据库正常工作!


0

确实,您将需要Google plus Enabled。对我来说最大的事情是项目URL。在VS中打开属性窗口(视图->属性窗口),然后右键单击项目并选择属性。在小型属性窗口中,复制您的SSL URL,然后在较大的属性窗口中,选择“ Web”选项卡,然后将该URL粘贴到“项目URL”中。

为我解决了此问题。

详细信息请参见:https : //docs.microsoft.com/zh-cn/aspnet/mvc/overview/security/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2-and -openid登录


0

对我来说,我虽然很旧,但正在将.NET 4.6.1 MVC网站迁移到核心1.1。在我将其恢复之前,工作停止了,然后才将其备份,然后迁移到2.x。

我的问题是来自Google的回调与404我网站上的会面。我以为应该击中AccountController.ExternalLoginCallback所以我添加了一个[Route(...)]给它,果然,谷歌的回调成功了。

然后null按此行中返回的内容(什么样的疯子会返回null??)

var externalLoginInfo = await this.SignInManager.GetExternalLoginInfoAsync();

我对其进行了反向工程,以发现其最终获得处理程序的机会 ExternalScheme对我来说是cookie处理程序!

一切似乎都错了,我觉得中间件应该以某种方式截获回调URI,所以我删除[Route(...)]404问题又回来了。

然后,我发现我需要在启动过程中添加它。

applicationBuilder.UseAuthentication();

这解决了404问题,但又提出了另一个问题。

没有指定authenticationScheme,也没有找到DefaultSignInScheme。

通过在此处添加默认方案,我可以解决上述错误。

serviceCollection.AddAuthentication(IdentityConstants.ExternalScheme)
    .AddGoogle(googleOptions => Configuration.Bind("OAuth2:Providers:Google", googleOptions))
    .AddExternalCookie();

现在AccountController.ExternalLoginCallback被一些魔术再次调用,但是我回到了null返回值。

我将此代码添加到了令人反感的行上方,这实际上是幕后发生的事情(查看GitHub上的Microsoft代码)。有趣的是,h它是类型CookieAuthenticationHandlera并且我的所有主张和信息都来自Google!

var authHandler = this.HttpContext.RequestServices.GetRequiredService<IAuthenticationHandlerProvider>();
var h = await authHandler.GetHandlerAsync(this.HttpContext, IdentityConstants.ExternalScheme);
var a = await h.AuthenticateAsync();

var externalLoginInfo = await this.SignInManager.GetExternalLoginInfoAsync();

进入GitHub并将其内部代码粘贴到我的控制器中,我可以发现它ClaimTypes.NameIdentifier在我的声明中找不到,ProviderKey稍后将使用。

嗯...

有关我正在使用旧的1.x AccountController带有更新的2.x标识位的代码,所以我确实找到了一些仍在使用这些东西的示例,以及一些同样使用Razor页面的示例。我将继续我所拥有的。

因此,我接下来将研究将其他Google用户JSON有效负载项映射到声明中。我认为,如果我的Google帐户ID(我想是数字)已映射,那么一切都会正常。

https://docs.microsoft.com/zh-cn/aspnet/core/security/authentication/social/additional-claims?view=aspnetcore-2.2

最终修复

最后,我添加了“声明操作”以将我的Google标识符从Google传回的JSON中拉出来,从而解决了该问题!

serviceCollection.AddAuthentication(IdentityConstants.ExternalScheme)
    .AddGoogle(googleOptions =>
    {
        Configuration.Bind("OAuth2:Providers:Google", googleOptions);

        googleOptions.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "sub", "string");
    })
    .AddExternalCookie();

sub字段包含在什么最终结束了nameidentifier要求,然后进入ProviderKeyAccountController希望。


0

就我而言,解决方案是更新Nuget包Microsoft.Owin.Security和Microsoft.Owin.Security.Google


-1

所有其他答案都无法解决我的问题,因此,如果您的答案相同,请确保您的注册控制器操作具有RequireHttps属性:

    // GET: /Account/LoginRegister
    [AllowAnonymous]
    [RequireHttps]
    public ActionResult LoginRegister()
    {
        return View(new RegisterLoginViewModel());
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.