从.NET Backend Azure Mobile Service中的身份验证令牌获取名称,电子邮件ID等用户信息

时间:2015-09-04 04:57:10

标签: c# authentication azure azure-mobile-services

我正在使用Azure移动服务向我的Windows应用商店应用添加身份验证。通过移动服务文档中的this文章,我可以获得UserId以及MobileServiceAuthenticationToken(适用于Google和Microsoft帐户)

我的问题是如何在name, email Id后端移动服务中使用MobileServiceAuthenticationToken获取.NET等用户信息。我已经阅读了各种文章,解释了如何在Javascript后端移动服务中完成此操作,但在C# + .NET后端移动服务中找不到任何正确实现的内容。

任何指示赞赏。

谢谢

2 个答案:

答案 0 :(得分:7)

Facebook,Google在授权时不会返回您的用户个人资料名称,电子邮件。他们正在为您提供access token,可用于将来的请求。

您需要使用name, emailMobileServiceAuthenticationToken申请Facebook Graph API。

您可以使用此库访问Facebook API: https://facebookgraphapi.codeplex.com/

// MobileServiceAuthenticationToken <- your token
var facebook = new FacebookGraphAPI(MobileServiceAuthenticationToken);

// Get user profile data 
var user = facebook.GetObject("me", null);
Console.WriteLine(user["name"]);

答案 1 :(得分:3)

使用来自.Net Backend Azure Mobile Service的身份验证令牌获取用户信息:

  1. 访问this link,为不同的提供商设置身份验证的移动服务 - 我是为微软,Google和Facebook做过的。
  2. 向移动服务添加新控制器并添加以下代码:
  3.     public class UserInfoController:ApiController     {         public ApiServices Services {get;组; }

        [AuthorizeLevel(AuthorizationLevel.User)]
        public async Task<JObject> GetUserInfo()
        {
            //Get the current logged in user
            ServiceUser user = this.User as ServiceUser;
            if (user == null)
            {
                throw new InvalidOperationException("This can only be called by authenticated clients");
            }
    
            //Get Identity Information for the current logged in user
            var identities = await user.GetIdentitiesAsync();
            var result = new JObject();
    
            //Check if the user has logged in using Facebook as Identity provider
            var fb = identities.OfType<FacebookCredentials>().FirstOrDefault();
            if (fb != null)
            {
                var accessToken = fb.AccessToken;
                result.Add("facebook", await GetProviderInfo("https://graph.facebook.com/me?access_token=" + accessToken));
            }
    
            //Check if the user has logged in using Microsoft Identity provider
            var ms = identities.OfType<MicrosoftAccountCredentials>().FirstOrDefault();
            if (ms != null)
            {
                var accessToken = ms.AccessToken;
                result.Add("microsoft", await GetProviderInfo("https://apis.live.net/v5.0/me/?method=GET&access_token=" + accessToken));
            }
    
            //Check if the user has logged in using Google as Identity provider
            var google = identities.OfType<GoogleCredentials>().FirstOrDefault();
            if (google != null)
            {
                var accessToken = google.AccessToken;
                result.Add("google", await GetProviderInfo("https://www.googleapis.com/oauth2/v1/userinfo?access_token=" + accessToken));
            }
    
            return result;
        }
    
        private async Task<JToken> GetProviderInfo(string url)
        {
            var c = new HttpClient();
            var resp = await c.GetAsync(url);
            resp.EnsureSuccessStatusCode();
            return JToken.Parse(await resp.Content.ReadAsStringAsync());
        }
    }
    

    完成后发布移动服务。上面的代码获取当前登录用户的身份信息,然后根据用户选择的身份验证提供程序(Microsoft,Facebook或Google),它会调用该身份提供者的用户配置文件API并获取用户信息。

    1. 在客户端应用程序中添加以下代码,以便在移动服务中调用GetUserInfo方法:
    2. var user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount);                  
      var userInfo = await App.MobileService.InvokeApiAsync("userInfo", HttpMethod.Get, null);
      

      但是,如果您的应用程序需要的数量超过可以在登录期间请求其他范围,则只会带来一些基本用户信息,例如名称,性别等,方法是在Azure服务中的移动服务配置选项卡中设置MS_FacebookScope和MS_MicrosoftScope应用程序设置

      您可以从excellent article

      获取有关此内容的详细信息