2015-09-10 49 views
1

我已经创建了一个应用程序与用户的asp.net mvc api,跟随this tutorial。一切都很好。本地用户和Facebook登录工作正常。asp.net mvc API获取Facebook令牌

但现在我试图使用FacebookClient并获取用户信息和朋友。 但它询问我的令牌,但不是存储在我的会话或cookie上的相同标记。

在API控制器帐户,在GetExternalLogin行动我有这样的代码:

if (hasRegistered) 
      { 
       Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie); 

       ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(UserManager, 
        OAuthDefaults.AuthenticationType); 
       ClaimsIdentity cookieIdentity = await user.GenerateUserIdentityAsync(UserManager, 
        CookieAuthenticationDefaults.AuthenticationType); 

       AuthenticationProperties properties = ApplicationOAuthProvider.CreateProperties(user.UserName); 
       Authentication.SignIn(properties, oAuthIdentity, cookieIdentity); 
      } 
      else 
      { 
       IEnumerable<Claim> claims = externalLogin.GetClaims(); 
       ClaimsIdentity identity = new ClaimsIdentity(claims, OAuthDefaults.AuthenticationType); 
       Authentication.SignIn(identity); 
      } 

在这里我能找到的索赔。但不是如何使用这个

我的问题是如何在登录后在我的api上存储Facebook令牌?

+0

由于很长一段时间你发布这些问题,你有没有找到如何将用户/登录/索赔保存在数据库。如果用户已经注册,该如何处理。 –

回答

1
var options = new FacebookAuthenticationOptions 
{ 
    AppId = "Your App ID", 
    AppSecret = "Your App Secret", 
    Provider = new FacebookAuthenticationProvider 
    { 
     OnAuthenticated = async context => 
     { 
      // Retrieve the OAuth access token to store for subsequent API calls 
      string accessToken = context.AccessToken; 

      // Retrieve the username 
      string facebookUserName = context.UserName; 

      // You can even retrieve the full JSON-serialized user 
      var serializedUser = context.User; 
     } 
    } 
}; 

app.UseFacebookAuthentication(options); 

有关如何做到这一点的东西更多信息请看这里:http://www.oauthforaspnet.com/providers/facebook/ F中的OnAuthenticated你还可以添加:

context.Identity.AddClaim(new Claim("FacebookToken", accessToken)); 

正如我敢肯定,在这一点上,我们已经创建了用户并创建了他们的索赔,所以你

+0

是的,它有帮助,但索赔没有保存。当我在context.Identity.AddClaim(新声明(“FacebookToken”,accessToken))中放置一个断点时;并复制AccessToken并手动使用它我可以使用它。我怎样才能得到这个说法? – BrunoRamalho

+0

如果你想保存访问令牌,你可以使用(我认为)Id来搜索你在存储机制中保存的客户端。如果没有用户存在,您可以创建一个关联到facebook并将代码存储在assosication表中。 我的意思是,您将用户保存为一条记录,并将facebook用户名+链接另存到另一条记录中,以便您可以为一位用户进行多次登录。 –

+0

如果您使用ASP.NET身份,您可以修改AspNetUserLogins表,以便在auth时包含ApiAccessCode,但我确信ASP.NET身份应该已经进入到AspNetUserLogins表中,因此您只需查看条目并添加代码 –