ASP.NET MVC5 OWIN Facebook身份验证突然不起作用

HaukurHaf:

更新2017!

我发布原始问题时遇到的问题与Facebook在迫使所有人使用其API版本2.3时所做的最新更改无关。有关该特定问题的解决方案,请参见下面的sammy34的答案/ oauth / access_token端点的2.3版现在返回JSON而不是表单编码的值

由于历史原因,这是我最初的问题/问题:

我有一个MVC5 Web应用程序,该应用程序使用通过Facebook和Google进行身份验证的内置支持。几个月前构建此应用程序时,我们遵循了本教程:http : //www.asp.net/mvc/tutorials/mvc-5/create-an-aspnet-mvc-5-app-with-facebook-and -google-oauth2-和-openid登录,一切都很好。

现在,突然之间,Facebook身份验证完全停止了工作。Google身份验证仍然有效。

问题描述:我们单击链接以使用Facebook进行连接,如果我们不想允许我们的Facebook应用程序访问我们的个人资料,则会重定向到Facebook,并在其中提示您。当我们单击“确定”时,我们将被重定向回我们的站点,但是没有登录,我们只是在登录屏幕上结束了。

我已经在调试模式下完成了此过程,并且按照上述教程在我的帐户控制器中获得了此ActionResult:

// GET: /Account/ExternalLoginCallback
[AllowAnonymous]
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
    var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
    if (loginInfo == null)
    {
        return RedirectToAction("Login");
    }
    ............

单步执行代码时以及从Facebook返回时,loginInfo对象始终为NULL,这将导致用户重定向回登录名。

为了了解幕后实际发生的情况,我安装了Fiddler并监视了HTTP流量。我发现,在Facebook权限对话框中单击“确定”后,Facebook使用以下URL重定向回我们的应用程序:

https://localhost/signin-facebook?code=<access-token>

这个URL不是一个实际的文件,可能是由我猜测在此OWIN框架中内置的某些控制器/处理程序处理的。它很可能使用给定的代码连接回Facebook,以查询有关试图登录的用户的信息。现在,问题是我们没有这样做,而是被重定向到:

/Account/ExternalLoginCallback?error=access_denied

我确定Facebook正在这样做,也就是说,它没有向我们提供用户数据,而是通过此错误消息将我们重定向回去。

这会导致AuthenticationManager.GetExternalLoginInfoAsync();失败,并始终返回NULL。

我完全没有主意。据我们所知,我们并没有做出任何改变。

我尝试创建一个新的Facebook应用程序,尝试再次按照该教程进行操作,但是我始终遇到相同的问题。

任何想法欢迎!

更新!

好吧,这让我发疯了!现在,我已经手动完成了执行身份验证所需的步骤,并且当我这样做时,一切都很好。为什么在使用MVC5 Owin东西时这不起作用?

这就是我所做的:

    // Step 1 - Pasted this into a browser, this returns a code
    https://www.facebook.com/dialog/oauth?response_type=code&client_id=619359858118523&redirect_uri=https%3A%2F%2Flocalhost%2Fsignin-facebook&scope=&state=u9R1m4iRI6Td4yACEgO99ETQw9NAos06bZWilJxJrXRn1rh4KEQhfuEVAq52UPnUif-lEHgayyWrsrdlW6t3ghLD8iFGX5S2iUBHotyTqCCQ9lx2Nl091pHPIw1N0JV23sc4wYfOs2YU5smyw9MGhcEuinvTAEql2QhBowR62FfU6PY4lA6m8pD3odI5MwBYOMor3eMLu2qnpEk0GekbtTVWgQnKnH6t1UcC6KcNXYY

I was redirected back to localhost (which I had shut down at this point to avoid being redirected immediately away).  The URL I was redirected to is this:

https://localhost/signin-facebook?code=<code-received-removed-for-obvious-reasons>

Now, I grabbed the code I got and used it in the URL below:

// Step 2 - opened this URL in a browser, and successfully retrieved an access token
https://graph.facebook.com/oauth/access_token?client_id=619359858118523&redirect_uri=https://localhost/signin-facebook&client_secret=<client-secret>&code=<code-from-step-1>

// Step 3 - Now I'm able to query the facebook graph using the access token from step 2!

https://graph.facebook.com/me?access_token=<access-token-from-step-2>

没有错误,一切正常!那么,为什么在使用MVC5 Owin东西时这根本不起作用?OWin实现显然存在问题。

HaukurHaf:

好的,我已经解决了这个问题。

这是我以前在Startup.Auth.cs文件中拥有的代码:

var x = new FacebookAuthenticationOptions();
            //x.Scope.Add("email");
            x.AppId = "1442725269277224";
            x.AppSecret = "<secret>";
            x.Provider = new FacebookAuthenticationProvider()
            {
                OnAuthenticated = async context =>
                {
                        //Get the access token from FB and store it in the database and
                    //use FacebookC# SDK to get more information about the user
                    context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken",context.AccessToken));
                    context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:name", context.Name));
                    context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:email", context.Email));
                }
            };
            x.SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie;
            app.UseFacebookAuthentication(x);

请注意

x.Scope.Add("email")

行已被注释掉,但是稍后我仍在OnAuthenticated处理程序中查询电子邮件吗?是的,没错。由于某种原因,它可以完美地工作几个星期。

我的解决方案是简单地取消对x.Scope.Add(“ email”);的注释。行以确保在对Facebook的初始请求中存在scope = email变量。

现在一切都按原样进行!

我不明白为什么它能像以前那样起作用。我能提出的唯一解释是,Facebook最终改变了某些东西。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用托管在GoDaddy上的ASP.NET MVC5 OWIN身份验证在5分钟后过期

使用Windows身份验证和OWIN的ASP.NET MVC5 / AngularJS / Web API应用

ASP.NET MVC5 OWIN拒绝长网址

Microsft Owin Facebook身份验证在MVC应用程序中不起作用

ASP.NET MVC - 自定义身份验证不起作用

如何在OWIN ASP.NET MVC5中注销用户

MVC5 Facebook身份验证不起作用

Asp.net MVC-5身份突然不起作用

ASP.Net 5身份持久身份验证不起作用IIS 7.5空闲计时器

多域名ASP.NET MVC应用程序的跨域OWIN身份验证

IdentityServer4替换Asp.net 4.5 MVC5 SimpleMembership进行身份验证

登录时的 ASP.NET MVC5 身份验证

覆盖Asp.net身份MVC5

SignalR ASP.NET MVC5身份

ASP.NET MVC5身份定制

ASP.NET MVC5身份实现

未验证 ASP.NET MVC5 模型

Gzip压缩不起作用ASP.net MVC5

ASP.NET MVC 5.1 C#OWIN Facebook身份验证或登录要求生日,喜欢,公共资料,电话号码

身份:在两个不同的asp.net mvc5应用程序中的身份验证

如何使用ASP.NET MVC5 Windows身份验证对首次登录执行一次操作

使用ExternalLoginCallback进行身份验证如何获取UserId和UserName ASP.NET MVC5

在ASP.NET MVC5中使用自定义登录进行表单身份验证

通过使用现有数据库的ASP.NET MVC 5 Identity 2.0和OWIN两因素身份验证

ASP.NET MVC5:RedirectToAction

Owin自托管&ASP .Net MVC

使用MVC5和OWIN的自定义身份

为什么我的Cookie身份验证在ASP .NET Core中不起作用?

Windows身份验证在现有的asp.net网站中不起作用