2014-10-27 41 views
3

我正試圖使用​​Microsoft OWIN OAuth庫在現有的ASP.NET MVC 5應用程序中實現Facebook身份驗證,並且無法找到如何獲取用戶的電子郵件地址的方法。註冊如下所示:Facebook不會爲用戶返回電子郵件

var options = new FacebookAuthenticationOptions 
{ 
    AppId = "YYY", 
    AppSecret = "ZZZ" 
}; 

options.Scope.Add("public_profile"); 
options.Scope.Add("email"); 
app.UseFacebookAuthentication(options); 

將範圍email添加到選項中。

在認證時,在控制器ExternalLoginCallback方法,所述email爲null與此代碼:

AuthenticateResult authResult = await authenticationManager.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie); 

ClaimsIdentity externalIdentity = authResult.Identity; 
string email = externalIdentity.FindFirstValue(ClaimTypes.Email); 

也試過此無濟於事:從Facebook返回

var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); 
var email = loginInfo.Email; 

JSON數據的確似乎沒有包含電子郵件地址:

{"id":"989197284440871","first_name":"Martin","gender":"male","last_name":"Stauf\u010d\u00edk","link":"https:\/\/www.facebook.com\/app_scoped_user_id\/989197284440871\/","locale":"cs_CZ","name":"Martin Stauf\u010d\u00edk","timezone":2,"updated_time":"2014-10-18T16:14:08+0000","verified":true} 

與Facebook不返回地址或代碼中缺少某些東西是否存在問題?任何幫助提供將不勝感激。

謝謝。

+0

假設「電子郵件」是範圍的正確名稱,我會說你問電子郵件的範圍,但用戶是否也授予它? – 2014-10-29 09:00:34

回答

0

要回答我的問題,我剛纔已經升級到使用最新的組件MVC 5.2.3和3.0.1 OWIN,應用程序,現在認證工作中。獲取電子郵件地址的代碼是:

[AllowAnonymous] 
public async Task<ActionResult> ExternalLoginCallback(string returnUrl) 
{ 
    var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); 
    var email = loginInfo.Email; 

    ... 
} 

這是在Visual Studio中創建的新ASP.NET MVC Web項目附帶的默認代碼。無論現在是什麼問題,它都是固定的。

-1

我測試下面的代碼和它的作品

var loginInformation = await AuthenticationManager.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie); 
if (loginInformation != null && loginInformation.Identity != null && 
     loginInformation.Identity.IsAuthenticated) 
{ 
    var claimsIdentity = loginInformation.Identity; 
    var providerKeyClaim = claimsIdentity.FindFirst(ClaimTypes.NameIdentifier); 
    string providerKey = providerKeyClaim.Value; 
    string issuer = providerKeyClaim.Issuer; 
    string name = claimsIdentity.FindFirstValue(ClaimTypes.Name); 
    string emailAddress = claimsIdentity.FindFirstValue(ClaimTypes.Email); 
} 
相關問題