我正在构建一个ASP。. NET (4.6) WebApi项目,我使用的是ASP。NET身份验证与Facebook,谷歌和微软我的API。我已经成功地通过谷歌和微软进行了身份验证,但没有通过Facebook。我使用的是Visual Studio 2015
问题是我每次验证时都被拒绝访问。场景是这样的:
- 我做一个API调用localhost:2975/API/Account/ExternalLogins?returnUrl=%2F&generateState=true通过我的浏览器。
- 对于我的API支持的每个外部提供商,我都会收到指向我的API的链接。在Facebook的情况下,我得到了localhost:2975/api/Account/ExternalLogin?provider=Facebook&response_type=token&client_id=self&redirect_uri=http%3A%2F%2Flocalhost%3A2975%2F&state=99…01
- 我用浏览器打开那个链接,然后被重定向到Facebook登录页面。
- 我向Facebook进行身份验证,然后出现一个对话框窗口,询问我请求的有关我的信息的许可。
- 我接受并获得重定向回我的API错误"access_denied"。localhost:2975/api/Account/ExternalLogin被调用
我还没有弄清楚问题来自哪里,是否在我的Facebook应用程序中的一些权限设置,我登录的Facebook用户,或者如果问题在于ASP。. NET标识模板。
关于Facebook,我已经为我的应用创建了一个测试应用,并将其作为live应用推送。我可以在我的Facebook个人资料中找到该应用,并且我已经删除了几次。我的Facebook个人资料具有该应用的管理员角色。我已经创建了测试用户,并添加了我的一个朋友作为该应用的开发/测试人员。问题仍然存在。我在某个地方读到应该有一个待处理的应用程序请求,我应该接受,但我没有找到任何。
关于ASP。. NET标识模板在处理过程中很早就收到错误:
AccountController.cs:
public async Task<IHttpActionResult> GetExternalLogin(string provider, string error = null)
{
if (error != null)
{
// This is where the API comes in step 5 above
return Redirect(Url.Content("~/") + "#error=" + Uri.EscapeDataString(error));
}
if (!User.Identity.IsAuthenticated)
{
// This is where the API comes in step 2 above before it redirects me to Facebook login
return new ChallengeResult(provider, this);
}
ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity);
// Untouched logic
// ....
}
当我使用谷歌chrome网络工具时,我可以看到我被重定向到这个链接:facebook.com/login.php ? skip_api_login = 1, api_key = XXX& signed_next = 1,接下来3 = https % % 2 f % 2 fwww.facebook.com % 2 fv2.6 % 2 fdialog % 2 foauth % 3 fredirect_uri % 3 dhttp % % 252 f % 253 252 253 a2975 flocalhost % % 252 fsignin-facebook % 26州% 3 d %…% 26范围252 cpublic_profile demail % % 26 response_type %…% 3 dcode % 26 client_id % 3 d 26 ret % 3 dlogin % 26 logger_id % 3 d…,cancel_url 3 = http % % 2 f % 2 flocalhost % 3 a2975 % 2 fsignin-facebook % 3 f 错误% 3 daccess_denied % 26 error_code % 3 d200 % 26 error_description % 3 dpermissions % 2 berror % 26 error_rea儿子% 3 duser_denied % 26州%…% 3 d 23 _ % 3 d_&显示= page&地区= sv_SE& logger_id =…有一个取消url预定义错误:"access_denied",错误代码:200,原因:"user_denied",所以也许我收到的"access_denied"错误不是很准确?
我能想出的其他相关代码是在Startup.Auth.cs(我从来没有得到OnAuthenticated部分虽然):
var facebookOptions = new FacebookAuthenticationOptions()
{
AppId = "XXX",
AppSecret = "XXX",
Scope = { "email", "public_profile" }
};
facebookOptions.Provider = new FacebookAuthenticationProvider()
{
OnAuthenticated = (context) =>
{
context.Identity.AddClaim(new Claim("urn:facebook:access_token", context.AccessToken, ClaimValueTypes.String, "Facebook"));
context.Identity.AddClaim(new Claim("urn:facebook:email", context.Email, ClaimValueTypes.Email, "Facebook"));
return Task.FromResult(0);
}
};
app.UseFacebookAuthentication(facebookOptions);
感觉我什么都试过了。对如何解决这个问题有什么想法吗?
提前感谢!
NuGet更新包解决了我的问题
从这篇文章开始
context.Identity.AddClaim(new Claim("urn:facebook:email", context.Email, ClaimValueTypes.Email, "Facebook"));
上下文。
尝试更新Microsoft.Owin.Security、Microsoft.Owin.Security. net的nuget包。Facebook等等
那些无法通过更新nuget
包来解决问题的人,它可能会有所帮助。
我们的Web App
与外部登录工作良好,之前发生的事情是我们的应用程序将用户重定向到Facebook
或Google
进行身份验证,并从他们的帐户返回相关详细信息。但是这个问题出现了,其中重定向url包含一个值为Access_Denied
的错误。这根本不是描述性的,所以你需要手动找到错误。
经过大量的调试和nuget
更新后,我仍然无法解决这个问题,然后结果证明解决方案是服务器的IP whitelisting
,因为我们的it团队和一些开发人员更改了服务器设置或将网站迁移到显然具有不同IP
的新服务器。因此,我将Facebook开发控制台的IP地址添加到whitelist
地址中,它就像一个魅力。
然而,Google身份验证是在没有白名单的情况下修复的,仅仅更新nuget
包就完成了这项工作。