2017-10-18 166 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(); 
} 

我们收到的承载令牌的结果。从中提取身份我们会收到先前保存的声明。

相关问题