0

코드는 null를 돌려줍니다웹 API 페이스 북은 이메일 주장은</p> <p>시작 인증을 다음과 같이

VAR 정보 = AuthenticationManager_GetExternalLoginInfoAsync_WithExternalBearer을 기다리고 있습니다() ;

private async Task<ExternalLoginInfo> AuthenticationManager_GetExternalLoginInfoAsync_WithExternalBearer() 
    { 
     ExternalLoginInfo loginInfo = null; 

     var result = await Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ExternalBearer); 

     if (result != null && result.Identity != null) 
     { 
      var idClaim = result.Identity.FindFirst(ClaimTypes.NameIdentifier); 
      if (idClaim != null) 
      { 
       loginInfo = new ExternalLoginInfo() 
       { 
        DefaultUserName = result.Identity.Name == null ? "" : result.Identity.Name.Replace(" ", ""), 
        Login = new UserLoginInfo(idClaim.Issuer, idClaim.Value), 
       }; 

      } 
     } 
     return loginInfo; 
    } 

기본에 RegisterExternal 클래스는 인증 유형 쿠키를 사용하기 때문입니다 :이 클래스

. 내가 그것을 사용할 때마다 null을 반환 할 것이므로 웹을 서핑 한 후에 인증을 위해 전달자를 사용하는이 코드를 추가해야한다는 사실을 알게 되었다면 사용자 이름과 ID가 더 이상 null이 아닌 응답이 발생합니다 따라서 권한이 부여됩니다. 내가 이메일을 주장 할 때이 작업을 수행 할 수 없습니다 (아래 그림 참조)

Return object (username and login)

하지만. 그것은 내가 상관없이 항상 null을 반환합니다.

+0

Facebook은 이메일 소유권 주장을 이행 할 필요가 없습니다. 항상 그렇습니까? 다른 FB 계좌로 확인할 수 있습니까? – RVid

+0

나는 페이스 북이 실제로 그 요청에 따라 이메일을 요구하고 있다는 것을 확인했다. 나는 그 요청을 조사 할 때 페이스 북이 내 이메일을 보내는 것을 본다. (버튼을 누를 때마다 페이 스북 (Facebook)을 통한 로그인은 '앱이 다음을 수신함'이라는 화면을 띄우며 이메일을 요구하고 데이터를 편집하면 내 이메일이 표시되므로 제대로 작동합니다) –

+0

이 @MichaelTralala를 해결 ​​한 적이 있습니까? 같은 순간에 실행 – Braydie

답변

1

동일한 문제가 발생하여 Facebook Nuget 패키지를 사용하여 추가 필드를 얻었습니다. 내 응용 프로그램에서

내가 FacebookAuthenticationProvider을 구현하고 다음으로 Authenticated(...) 방법을 재정의 :

public class FacebookAuthProvider : FacebookAuthenticationProvider 
{ 
    public override Task Authenticated(FacebookAuthenticatedContext context) 
    { 
     var accessTokenClaim = new Claim("ExternalAccessToken", context.AccessToken, "urn:facebook:access_token"); 
     context.Identity.AddClaim(accessTokenClaim); 
     var extraClaims = GetAdditionalFacebookClaims(accessTokenClaim); 
     context.Identity.AddClaim(new Claim(ClaimTypes.Email, extraClaims.First(k => k.Key == "email").Value.ToString())); 
     context.Identity.AddClaim(new Claim("Provider", context.Identity.AuthenticationType)); 
     context.Identity.AddClaim(new Claim(ClaimTypes.Name, context.Identity.FindFirstValue(ClaimTypes.Name))); 

     var userDetail = context.User; 
     var link = userDetail.Value<string>("link") ?? string.Empty; 
     context.Identity.AddClaim(new Claim("link", link)); 
     context.Identity.AddClaim(new Claim("FacebookId", userDetail.Value<string>("id"))); 
     return System.Threading.Tasks.Task.FromResult(0); 
    } 

    private static JsonObject GetAdditionalFacebookClaims(Claim accessToken) 
    { 
     var fb = new FacebookClient(accessToken.Value); 
     return fb.Get("me", new { fields = new[] { "email", "first_name", "last_name" } }) as JsonObject; 
    } 
} 

Startup.csConfiguration(IAppBuilder app) 내이 있습니다 이메일이 왜

FacebookAuthOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions 
{ 
     AppId = "YOUR APP ID", 
     AppSecret = "YOUR APP SECRET", 
     Microsoft.Owin.PathString("/Account/ExternalCallBack"), // whatever your external callback url is 
     Provider = new FacebookAuthProvider() 
}; 
FacebookAuthOptions.Scope.Add("email"); 
app.UseFacebookAuthentication(FacebookAuthOptions); 

나는 아무 생각도 없어 처음에는 채워지지 않았지만이 접근법은 나를 위해 일했습니다.

+0

그레이트, 나는 그것을 최대한 빨리 테스트 할 것입니다! –