C# 从.NET后端Azure移动服务中的身份验证令牌获取用户名、电子邮件Id等用户信息

C# 从.NET后端Azure移动服务中的身份验证令牌获取用户名、电子邮件Id等用户信息,c#,authentication,azure,azure-mobile-services,C#,Authentication,Azure,Azure Mobile Services,我正在使用Azure移动服务向我的Windows应用商店应用程序添加身份验证。在移动服务文档中的以下文章中,我能够获得用户ID以及MobileServiceAuthenticationToken(既适用于Google,也适用于Microsoft帐户) 我的问题是如何在.NET后端移动服务中使用MobileServiceAuthenticationToken获取用户信息,如姓名、电子邮件Id等。我已经阅读了各种文章,解释了如何在Javascript后端移动服务中实现这一点,但找不到在C++.NET

我正在使用Azure移动服务向我的Windows应用商店应用程序添加身份验证。在移动服务文档中的以下文章中,我能够获得用户ID以及
MobileServiceAuthenticationToken
(既适用于Google,也适用于Microsoft帐户)

我的问题是如何在
.NET
后端移动服务中使用
MobileServiceAuthenticationToken
获取用户信息,如
姓名、电子邮件Id等。我已经阅读了各种文章,解释了如何在
Javascript
后端移动服务中实现这一点,但找不到在
C++.NET
后端移动服务中正确实现的任何内容

欢迎指点


感谢Facebook,授权时Google不会返回您的用户资料名称和电子邮件。他们给你
访问令牌
,可用于将来的请求

例如,您需要使用您的
MobileServiceAuthenticationToken
向Facebook Graph API请求
名称、电子邮件

您可以使用此库访问Facebook API:


//MobileServiceAuthenticationToken用于使用.Net后端Azure移动服务的身份验证令牌获取用户信息:

  • 通过访问为不同的提供商设置移动服务的身份验证-我为微软、谷歌和Facebook做了这件事
  • 将新控制器添加到移动服务并添加以下代码:
  • 公共类UserInfoController:ApicController { 公共服务{get;set;}

        [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());
        }
    }
    
    [授权级别(AuthorizationLevel.User)]
    公共异步任务GetUserInfo()
    {
    //获取当前登录的用户
    ServiceUser用户=此用户作为ServiceUser;
    if(user==null)
    {
    抛出新的InvalidOperationException(“这只能由经过身份验证的客户端调用”);
    }
    //获取当前登录用户的身份信息
    var identies=await user.getidentiesasync();
    var result=new JObject();
    //检查用户是否已使用Facebook作为身份提供商登录
    var fb=identifications.OfType().FirstOrDefault();
    如果(fb!=null)
    {
    var accessToken=fb.accessToken;
    结果。添加(“facebook”,等待GetProviderInfo(“https://graph.facebook.com/me?access_token=“+accessToken”);
    }
    //检查用户是否已使用Microsoft Identity provider登录
    var ms=identies.OfType().FirstOrDefault();
    如果(毫秒!=null)
    {
    var accessToken=ms.accessToken;
    结果。添加(“microsoft”,等待GetProviderInfo(“https://apis.live.net/v5.0/me/?method=GET&access_token=“+accessToken”);
    }
    //检查用户是否已使用谷歌作为身份提供商登录
    var google=identies.OfType().FirstOrDefault();
    if(google!=null)
    {
    var accessToken=google.accessToken;
    结果。添加(“谷歌”,等待GetProviderInfo(“https://www.googleapis.com/oauth2/v1/userinfo?access_token=“+accessToken”);
    }
    返回结果;
    }
    专用异步任务GetProviderInfo(字符串url)
    {
    var c=新的HttpClient();
    var resp=wait c.GetAsync(url);
    resp.EnsuccessStatusCode();
    返回JToken.Parse(wait resp.Content.ReadAsStringAsync());
    }
    }
    

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

  • 在客户端应用程序中添加以下代码以调用移动服务中的GetUserInfo方法:
  • var user=wait App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount); var userInfo=wait App.MobileService.InvokeApiAsync(“userInfo”,HttpMethod.Get,null); 但是,这只会带来一些基本的用户信息,如姓名、性别等。如果您的应用程序需要更多的信息,您可以在登录期间通过在azure portal的“移动服务配置”选项卡中设置MS_FacebookScope和MS_MicrosoftScope应用程序设置来请求其他作用域


    你可以从这个

    中获得更详细的信息,我试用了Facebook Graphs API,但我没有遇到System.Net异常。这是我的代码:
    MobileServiceUser=wait App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.Facebook);var fb=新的FacebookGraphAPI(user.MobileServiceAuthenticationToken);var fbuser=fb.GetObject(“me”,null);字符串username=fbuser[“name”].ToString()我猜Graphs API不接受身份验证令牌,因为我在fb.GetObject(“me”,null)上出错;我不熟悉堆栈溢出,所以要计算出降价…:)我已经发布了代码,您可以发布您得到的具体异常吗?“mscorlib.dll中发生了类型为“System.IO.FileNotFoundException”的异常,但未在用户代码中处理其他信息:无法加载文件或程序集“System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。系统找不到指定的文件。'您是否已将
    system.Web
    添加到项目引用中?我正在尝试,是否有如何获取twitter信息的信息?
        [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());
        }
    }
    
    var user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount); var userInfo = await App.MobileService.InvokeApiAsync("userInfo", HttpMethod.Get, null);