此代码工作正常一年左右,此问题与Facebook将其API响应更改为JSON(而非常规查询字符串)有关
这是一个MVC5项目,我更新为https://www.nuget.org/packages/Microsoft.Owin.Security.Facebook/3.1.0-rc1 如下所示: ASP.NET MVC5 OWIN Facebook authentication suddenly not working并尝试按照此处的建议简化我的通话:https://github.com/aspnet/AspNetKatana/issues/38
此外,我尝试添加BackchannelHttpHandler类(但删除它,因为它不适合我),另外,我删除了我的Facebook网络应用程序(它是API 2.4)并创建了一个未批准的新的(2.8)但是,我认为测试应用程序应该可以正常工作。
我一直收到302错误= access_denied
这是我使用的代码:
var facebookAuthOptions = new FacebookAuthenticationOptions();
facebookAuthOptions.AppId = "xxx";
facebookAuthOptions.AppSecret = "yyy";
facebookAuthOptions.SendAppSecretProof = true;
facebookAuthOptions.CallbackPath = new PathString("/signin-facebook");
facebookAuthOptions.Scope.Add("public_profile");
facebookAuthOptions.Scope.Add("email");
facebookAuthOptions.Scope.Add("user_birthday");
// added for Microsoft.Owin.Security.Facebook/3.1.0-rc1
facebookAuthOptions.Fields.Add("email");
facebookAuthOptions.Fields.Add("birthday");
facebookAuthOptions.Fields.Add("gender");
facebookAuthOptions.Fields.Add("locale");
facebookAuthOptions.Fields.Add("location");
facebookAuthOptions.Fields.Add("timezone");
facebookAuthOptions.Provider = new FacebookAuthenticationProvider()
{
OnAuthenticated = (context) =>
{
context.Identity.AddClaim(new Claim("FacebookAccessToken", context.AccessToken));
var expiryDuration = context.ExpiresIn ?? new TimeSpan();
context.Identity.AddClaim(new Claim("urn:facebook:expires_in", DateTime.UtcNow.Add(expiryDuration).ToString(CultureInfo.InvariantCulture)));
// Add all other available claims
foreach (var claim in context.User)
{
var claimType = string.Format("urn:facebook:{0}", claim.Key);
var claimValue = claim.Value.ToString();
if (!context.Identity.HasClaim(claimType, claimValue))
context.Identity.AddClaim(new Claim(claimType, claimValue, "XmlSchemaString", "Facebook"));
}
return Task.FromResult(0);
}
};
app.UseFacebookAuthentication(facebookAuthOptions);
净流量看起来像这样:
https://localhost:44300/external-providers (302)
https://localhost:44300/signup-connect?error=access_denied (302)
答案 0 :(得分:1)
好的,我终于找到了问题,这花了我3天,绝对是2017年最烦人的错误。
所以,新的Owin RC1更新正在运行。另外,在我的情况下,不需要在facebookAuthOptions.Fields中指定任何内容,也不需要更改提供者等的任何其他内容(参见https://github.com/aspnet/AspNetKatana/issues/38)
我曾经(现在仍然如此)的问题是,Facebook页面设置:高级:需要应用机密 - 总是设置为YES,现在,作为Facebook更改后的大规模混乱的一部分API,我还删除了我的Facebook应用程序并使用最新的2.8 API创建了一个新应用程序。
我的代码中也有这个:facebookAuthOptions.SendAppSecretProof = true; 这应该是有效的,但是现在我将Require App Secret设置为NO。
我认为facebook在他们的需求App Secret选项上做了一些事情并且打破了它,或者新的Owin RC1更新没有在FacebookAuthenticationOptions中传递SendAppSecretProof = true
无论如何,这是一个艰难的,希望有人在花了整整3-4天之前找到它。
这是当前有效的Facebook设置:
产品:Facebook登录:
客户端OAuth登录:否
Web OAuth登录:是
嵌入式浏览器OAuth登录:否
强制Web OAuth重新认证:否
从设备登录:否
有效的OAuth重定向URI:https://localhost:44300/signin-facebook
取消对回拨网址的授权:https://localhost:44300/signout
设置:高级:
要求App Secret:否
允许API访问应用程序设置:是
需要双因素重新授权:否
更新:appsecret_proof未正确传递给查询字符串,这将很快修复到新的Owin版本中,可以将Require App Secret设置回YES。