2023-02-15 286
我正在使用具有多个外部登录提供程序的ASP.NET身份,我需要处理以下方案:
1)用户登录使用外部服务(让我们说这是Facebook),
应用程序从Facebook中抓取一些信息(名字和姓氏,出生日期等)索赔包含此信息的索赔被添加到标识中.
2)我需要将此信息存储在应用程序db中,以获取以下方案:
管理员浏览注册用户列表
电子邮件订阅服务将使用名字和姓氏
问题是,如果用户更新他/她的Facebook个人资料(例如,更改电子邮件地址) – 在这种情况下,我还需要更新我的数据库中的信息(我在aspnetuserclaims表中存储外部索赔).实际上我需要每次验证外部用户时更新它.
这是它首次保存的代码:
延长索赔类:
public class ApplicationUserClaim : IdentityUserClaim<Guid>
{
public string Issuer { get; set; }
public string ClaimValueType { get; set; }
}
启动:
var facebookOptions = new FacebookAuthenticationOptions {
AppId = "...",
AppSecret = "...",
Provider = new FacebookAuthenticationProvider {
OnAuthenticated = (context) => {
context.Identity.AddClaims(new[] {
new Claim("LastName", context.User["last_name"].ToString(), ClaimValueTypes.String, "Facebook"),
new Claim("FirstName", context.User["first_name"].ToString(), ClaimValueTypes.String, "Facebook"),
//...Other claims
});
}
}
};
facebookOptions.Scope.Add("email");
facebookOptions.Scope.Add("user_birthday");
app.UseFacebookAuthentication(facebookOptions);
authcontroller
外部登录回调:
public ActionResult ExternalLogin(string returnUrl)
{
var loginInfo = authenticationManager.GetExternalLoginInfo();
//No user found - this is the first login with an external service
//Asking to confirm an external account
if(signInStatus == SignInStatus.Failure)
return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { ... });
}
在外部登录确认后创建用户(省略其他代码):
public ActionResult ExternalLoginConfirmation(ExternalLoginConfirmationViewModel loginConfirmationViewModel)
{
var loginInfo = authenticationManager.GetExternalLoginInfo();
var user = new ApplicationUser();
user.Logins.Add(new RegisteredUserLogin {
LoginProvider = loginInfo.Login.LoginProvider,
ProviderKey = loginInfo.Login.ProviderKey
});
//Converting Claims added in OnAuthenticated callback to ApplicationClaim objects to store them in Db
foreach(var userInfoClaim in loginInfo.GetUserInfoClaims())
user.Claims.Add(ClaimsHelper.ToUserClaimObject(userInfoClaim));
userManager.Create(user);
}
这效果很好,但在Facebook用户回来后,我卡住了更新的传入索赔值.处理这种情况的真正方法是什么?
THX.
这有点昂贵但最简单的答案:
您只需在用户登录并更新时检查相同的信息,如果发生更改.由于您没有与Facebook直接连接,因此您永远无法知道用户更改其信息.
这应该是一个好方法,除非你在一分钟内有数千个登录.
以上所述是小编给大家介绍的ASP.NET身份认证。授权后更新外部索赔,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/33766.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态