2017-10-18 163 views
1

我想註冊一個用戶,通過外部供應商(如Facebook),爲了得到我需要的信息,我配置FacebookProvider如下如何獲取Facebook的用戶信息的ASP.NET Web API 2

var options = new FacebookAuthenticationOptions { 
    AppId = "***", 
    AppSecret = "***", 
    Scope = { "email" }, 
    Provider = new FacebookAuthenticationProvider { 
     OnAuthenticated = (context) => { 
      foreach (var x in context.User) 
      { 
       var claimType = string.Format("urn:facebook:{0}", x.Key); 
       string claimValue = x.Value.ToString(); 
       if (!context.Identity.HasClaim(claimType, claimValue)) 
       context.Identity.AddClaim(new System.Security.Claims.Claim(claimType, claimValue, XmlSchemaString, "Facebook")); 
      } 

      return Task.FromResult(0); 
     } 
    } 
}; 

options.Fields.Add("id"); 
options.Fields.Add("name"); 
options.Fields.Add("email"); 

options.SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalBearer; 

app.UseFacebookAuthentication(options); 

在OnAuthenticated調試時我看到所有的必填字段,但是當我打電話RegisterExternal從郵遞員如下PIC

RegisterExternal call postman

GetExternalLoginInfoAsync返回null

var info = await Authentication.GetExternalLoginInfoAsync(); 
if (info == null) 
{ 
    return InternalServerError(); 
} 

那麼如何檢索郵件等查詢字段?我認爲所有必要的信息都存儲在cookie中,但是如何將它們傳輸到服務器並提取Identity實例?

所有的nuget包已經更新到最新版本

p.s.我計劃從iOS應用程序使用API​​

回答

0

我找到了解決方案。

改變ExternalLoginData類如下

private class ExternalLoginData 
{ 
    ... 
    // here added new field 
    public IList<Claim> Claims { get; private set; } 

    public static ExternalLoginData FromIdentity(ClaimsIdentity identity) 
    { 
     ... 
     return new ExternalLoginData 
     { 
      ... 
      // here added claims setting 
      Claims = identity.Claims.ToList() 
     }; 
    } 
} 

改變ExternalLogin回調如下

public async Task<IHttpActionResult> GetExternalLogin(string provider, string error = null) 
{ 
    ... 
    if (hasRegistered) 
    { 
     ... 
    } 
    else 
    { 
     // here replaced getting claims by Claims field 
     IEnumerable<Claim> claims = externalLogin.Claims; 
     //IEnumerable<Claim> claims = externalLogin.GetClaims(); 
     ClaimsIdentity identity = new ClaimsIdentity(claims, OAuthDefaults.AuthenticationType); 
     Authentication.SignIn(identity); 

    } 

    return Ok(); 
} 

我們收到的承載令牌的結果。從中提取身份我們會收到先前保存的聲明。

相關問題