有没有人能够直接使用ASP.NET MVC 5 Identity Facebook登录功能?(loginInfo始终返回null)

8
使用Visual Studio 2013 Update 5创建了一个基本的MVC 5应用程序,并选择了Individual User Accounts身份验证选项。我一直在尝试使用模板代码实现社交登录,但一直无法成功。
我已确保所有NuGet包都是最新的,并且代码使用的是MVC 5.2.3;Owin 3.0.1;AspNet.Identity 2.0.0。
我可以让所有东西正常工作,包括使用OtpSharp进行身份验证,但是Facebook登录无论我尝试什么都不起作用。
我已经创建了Facebook App,在其中设置了所有相关选项,并在我的Startup.Auth.cs文件中设置了AppId和AppSecret。
当我尝试使用Facebook登录时,MVC网站会将我重定向到Facebook,提示我输入该应用程序的身份验证屏幕。我点击OK并接受此操作,然后被重定向回MVC应用程序。如果我检查我的Facebook帐户下的已授权应用程序,我的应用程序将列出,并显示它已授予权限向应用程序提取电子邮件地址。
回调函数正常工作,但当它进入ExternalLoginCallback并执行以下操作时:
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync()

loginInfo 总是返回 null。

查看请求时,显示了 access_denied 的错误:

https://localhost:44301/Account/ExternalLoginCallback?ReturnUrl=%2Fmanage&error=access_denied

我已经阅读了关于这个错误的几乎所有博客文章和SO问题,虽然大部分都很有帮助,但大多数也已过时且不相关。

似乎模板项目缺少某些内容,或者其他地方发生了变化,因为无论我阅读哪个教程并设置哪些选项,结果都是相同的。

我已经在运行IIS Express的开发机器上以及在运行IIS 7.5的托管机器上尝试过这个问题,结果都是一样的。

我甚至反编译了Microsoft.Owin.Security.Facebook库,查看那个查询字符串的特定部分是如何设置的,但没有帮助。

如果我还有头发,现在肯定已经全部拔光了。

我会接受任何建议。有人能帮忙吗?


再次查看,我发现你正在使用本地主机...我从未在我的工作站上直接设置测试环境,但请检查您的配置是否与此处提到的配置匹配:https://dev59.com/qWYr5IYBdhLWcg3wy9SA - Kyle Burkett
是的,我已经检查过了。我的应用程序域中没有任何内容,但是将“localhost”放入其中也没有任何区别。 - Ira Rainey
@IraRainey 你确定你知道如何处理异步请求吗?可能你是立即打印日志信息而不是使用回调函数。 - GuyT
是的,它肯定正在调用回调函数。 - Ira Rainey
@IraRainey 在您的FB应用程序中设置有效的OAuth重定向URI为http://localhost:1234/signin-facebook。这对我有用。 - athar13
3个回答

2
Facebook喜欢把事情搞复杂。Access_denied听起来像是他们故意阻止你。请检查您的开发者控制面板以及在开发模式下测试您的应用程序时被授权的帐户。电子邮件权限默认已获批准,因此这不是您的问题。
请确保您正在测试的帐户已在此处添加:

facebook dashboard roles example

如果这不能解决问题,确保您在此处的域部分列出了正确的应用程序域(测试和生产)。

without the domain here, it will think someone else is trying to jack your app


谢谢Kyle,我已经检查过了,我是使用相同电子邮件地址测试的应用程序管理员。我还尝试将应用程序设置为公共并进行测试,但结果相同。 - Ira Rainey
我在我的回答中添加了更多内容。我没有直接处理您提供的代码的原因是,当我创建我的应用程序时,10个问题中有9个不是代码问题,而是开发仪表板配置问题。 - Kyle Burkett
谢谢,这正是我一直在思考的问题,特别是由于Facebook配置发生了如此大的变化。但是我尝试过的所有选项都导致了相同的问题。 - Ira Rainey

2
我遇到了完全相同的问题。无论我做什么,Facebook都会显示登录页面,获取权限,然后返回到登录页面,而不是电子邮件确认页面。
使用Fiddler,Facebook会调用“http://localhost:1234/signin-facebook&code=SOME_SECRET_CODE_HERE”,然后我的应用程序控制器会调用“http://localhost:1234/ExternalLoginCallback?error=access_denied”。我确信Facebook拒绝了访问。只有在实现了Facebook Javascript SDK示例之后,我才意识到我可以成功登录并查看FB范围! 我的开发环境
  • MVC 5 应用程序
  • Visual Studio 2013社区版更新5
  • Microsoft.OWIN v2.2.1
  • Microsoft.OWIN.Security.Facebook v3.0.1
最后我找到了一个由ProCoder制作的YouTube视频,提到在Valid OAuth redirect URIs中放置正确的路径,如http://localhost:1234/signin-facebook,这样就可以正常工作了。如果您还没有添加,需要将Facebook登录产品添加到您的Facebook应用中。
我还将应用程序域设置为localhost,网站URL设置为http://localhost:1234/
我已经将127.0.0.1MY.EXTERNAL.PUBLIC.IP添加到Facebook应用程序的高级设置选项下的安全性中的服务器IP白名单中。
我在新的MVC 5应用程序中复制了所有这些设置,并且它像魅力一样运行。

谢谢。下次我再看那个部分时会试一下。 - Ira Rainey
不幸的是,这些步骤对我没有用,我仍然收到空的登录信息。 - Nathan Tregillus
@Nathan,你的开发环境和我的一样吗?可能是 Facebook 更新了他们的 OAuth 实现。 - athar13
当我尝试获取owin nuget包时,出现了504 bad gateway错误。我重新启动后,成功获取了最新版本的包。 - Nathan Tregillus

1

将Owin.Security.Facebook包的版本从3.0.1更新至3.1.0

对我有效


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接