c# – WEB API 2:在oauth期间获取配置文件数据RegisterExternal(facebook)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – WEB API 2:在oauth期间获取配置文件数据RegisterExternal(facebook),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3382字,纯文字阅读大概需要5分钟。
内容图文
![c# – WEB API 2:在oauth期间获取配置文件数据RegisterExternal(facebook)](/upload/InfoBanner/zyjiaocheng/818/896629f13d6d48afa3c1fcd57d6d9430.jpg)
在新用户调用后,开箱即用的ASP.NET WEB API oAuth实现:
GET api/Account/ExternalLogins?returnUrl=%2F&generateState=true
用户被重定向到外部登录(在我的情况下是Facebook),导致他们用于注册的令牌(开箱即用的代码)
// POST api/Account/RegisterExternal
[OverrideAuthentication]
[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
[Route("RegisterExternal")]
public async Task<IHttpActionResult> RegisterExternal([FromBody]RegisterExternalBindingModel model)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity);
if (externalLogin == null)
{
return InternalServerError();
}
IdentityUser user = new IdentityUser
{
UserName = model.UserName
};
user.Logins.Add(new IdentityUserLogin
{
LoginProvider = externalLogin.LoginProvider,
ProviderKey = externalLogin.ProviderKey
});
IdentityResult result = await UserManager.CreateAsync(user);
IHttpActionResult errorResult = GetErrorResult(result);
if (errorResult != null)
{
return errorResult;
}
return Ok();
}
在RegisterExternal期间我想使用他们的Facebook上的数据填充另一个数据库(名字,姓氏,电子邮件,朋友,分机……)
我在注册时获得的Bearer令牌不能简单地这样称呼:
var accessToken = "token from header";
var client = new FacebookClient(accessToken);
所以根据我的理解,我需要通过添加以下内容来修改Startup.Auth以及对此数据的声明:
var facebookProvider = new FacebookAuthenticationProvider()
{
OnAuthenticated = (context) =>
{
// Add the email id to the claim
context.Identity.AddClaim(new Claim(ClaimTypes.Email, context.Email));
return Task.FromResult(0);
}
};
var options = new FacebookAuthenticationOptions()
{
AppId = "xxxxxxxxxxxxxxxxx",
AppSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
Provider = facebookProvider
};
options.Scope.Add("email");
options.Scope.Add("user_friends");
options.Scope.Add("public_profile");
app.UseFacebookAuthentication(options);
但是,我如何在RegisterExternal方法中获取数据呢?
解决方法:
我有同样的问题(我认为) – 问题是FB OAuth基础设施只填充基本数据,我想要更多.
在深入研究ASP.NET身份的源代码后,我得出以下结论:
app.UseFacebookAuthentication(new FacebookAuthenticationOptions
{
AppId = "",
AppSecret = "",
Scope = { "public_profile", "email", "user_birthday", "user_location" },
Provider = new FacebookAuthProvider(),
UserInformationEndpoint = "https://graph.facebook.com/v2.5/me?fields=id,name,email,first_name,last_name,location,birthday,picture",
});
这里的重要部分是自定义提供者:
private class FacebookAuthProvider : FacebookAuthenticationProvider
{
/// <summary>
/// Invoked whenever Facebook succesfully authenticates a user
/// </summary>
/// <param name="context">Contains information about the login session as well as the user <see cref="T:System.Security.Claims.ClaimsIdentity" />.</param>
/// <returns>A <see cref="T:System.Threading.Tasks.Task" /> representing the completed operation.</returns>
public override Task Authenticated(FacebookAuthenticatedContext context)
{
TryParseProperty(context, "first_name", Claims.FirstName);
TryParseProperty(context, "last_name", Claims.LastName);
TryParseProperty(context, "picture.data.url", Claims.PhotoUrl);
return base.Authenticated(context);
}
private void TryParseProperty(FacebookAuthenticatedContext context, string name, string targetName)
{
var value = context.User.SelectToken(name);
if (value != null)
{
context.Identity.AddClaim(targetName, value.ToString());
}
}
}
这基本上将所有数据放入索赔中,并且可以在任何其他地方以相同的方式检索.
内容总结
以上是互联网集市为您收集整理的c# – WEB API 2:在oauth期间获取配置文件数据RegisterExternal(facebook)全部内容,希望文章能够帮你解决c# – WEB API 2:在oauth期间获取配置文件数据RegisterExternal(facebook)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。