C# 从.NET后端Azure移动服务中的身份验证令牌获取用户名、电子邮件Id等用户信息
我正在使用Azure移动服务向我的Windows应用商店应用程序添加身份验证。在移动服务文档中的以下文章中,我能够获得用户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
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);