3

저는 ASP.NET (4.6) WebApi 프로젝트를 만들고 ASP.NET ID를 사용하여 Facebook, Google 및 Microsoft에서 내 API를 인증합니다. 나는 Google과 Microsoft는 인증했지만 Facebook은 인증하지 못했습니다. Visual Studio를 사용하고 있습니다. 2015ASP.NET WebApi Identity Facebook 로그인 액세스가 거부되었습니다.

문제는 인증 할 때마다 액세스가 거부된다는 것입니다. 시나리오는 다음과 같이 간다 : 내 브라우저를 통해 2975/API/계정/ExternalLogins returnUrl = % 2F & generateState = 사실 :

  1. 내가 로컬 호스트에 대한 API 호출을합니다.
  2. 외부 공급자마다 내 API에 대한 링크가 표시됩니다. 페이스 북의 경우 localhost : 2975/api/Account/ExternalLogin? provider = Facebook & response_type = 토큰 & client_id = self & redirect_uri = http % 3A % 2F % 2Flocalhost % 3A2975 % 2F & state = 99 ... 01
  3. 필자는 브라우저에서 해당 링크로 이동하여 Facebook 로그인 페이지로 리디렉션됩니다.
  4. 나는 Facebook에 인증하고, 대화창이 나타나서 나에 대한 요청 된 정보에 대한 허가를 요청합니다.
  5. 나는 "access_denied"오류와 함께 내 API를 수락하고 다시 API로 리디렉션됩니다. localhost : 2975/api/Account/ExternalLogin이 호출됩니다.

내 Facebook 응용 프로그램의 일부 권한 설정, 로그인 한 Facebook 사용자 또는 문제가 ASP.NET Identity 템플릿에있는 경우 문제가 어디에서 발생했는지 알 수 없습니다.

Facebook에 관해서는 내 앱의 테스트 앱을 만들었고 라이브 앱으로 푸시했습니다. 내 Facebook 프로필에서이 앱을 찾을 수 있으며 여러 번 제거했습니다. 내 Facebook 프로필에는 앱의 관리자 역할이 있습니다. 나는 테스트 사용자를 만들었고, 내 친구를 개발자/테스터로 추가했다. 문제는 여전히 남아 있습니다. 어딘가에 내가 받아 들여야하는 앱에 대한 보류중인 요청이 있어야한다는 것을 알았지 만 발견하지 못했습니다.

AccountController.cs : 나는 구글의 Chromes 네트워크 도구를 사용할 때

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 
    // .... 
} 

내가 리디렉션됩니다 것을 알 수 있습니다 오류가 과정에서 초기 수신되는 ASP.NET의 정체성 서식에 관한

facebook.com/login.php?skip_api_login=1 API_KEY = & & XXX signed_next = 1 = & 다음 HTTPS % 3A % 2F % 2Fwww.facebook.com % 2Fv2.6 % 2Fdialog % 2Foauth % 3Fredirect_uri % 3Dhttp이 링크 % 253A % 252F % 252Focalhost % 253A2975 % 252Fsignin-facebook % 26state % 3D ... % 2 6scope % 3Demail % 252Cpublic_profile % 26response_type % 3Dcode % 26client_id % 3D ... % 26ret % 3Dlogin % 26logger_id % 3D ... & cancel_url = http % 3A % 2F % 2Flocalhost % 3A2975 % 2Fsignin-facebook % 3F 오류 % 3Daccess_denied % 26error_code % 3D200 % 26error_description % 3DPermissions % 2Berror % 26error_reason % 3Duser_denied% 26state % 3D ... % 23_ % 3D_ & 디스플레이 = 페이지 & 로케일 = 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); 

나는 모든 것을 시도한 것처럼 느낀다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

미리 감사드립니다.

+0

늦게 업데이트 : 내 코드에 아무런 문제가 없었습니다. Facebook 응용 프로그램에서 일부 설정을 변경 한 후에 작동했습니다. – lundeqvist

+0

Facebook의 변경 사항은 무엇입니까? – Mahendra

+0

나는 또한이 설정에 대해 매우 궁금하다 ... – WtFudgE

답변

2

라인

context.Identity.AddClaim(new Claim("urn:facebook:email", context.Email, ClaimValueTypes.Email, "Facebook")); 

context.Email 포스트 this에서 null입니다.

+0

이것은 나를 위해 해냈다! – WtFudgE

2

는 Microsoft.Owin.Security, Microsoft.Owin.Security.Facebook하고 그렇게

+0

기본 템플릿에 v3.0.1이 포함되었습니다. 나는 패키지를 v3.1.0로 업데이트했고 제대로 작동했다. – KrimblKrum

2

업데이트 NuGet 패키지에 내 문제를 해결 nuget 패키지를 업데이트하려고합니다.

관련 문제