gpt4 book ai didi

ASP.NET 标识 : Update external claims after authorization

转载 作者:行者123 更新时间:2023-12-04 02:29:29 25 4
gpt4 key购买 nike

我将 ASP.NET Identity 与多个外部登录提供程序一起使用,我需要处理以下场景:

1) 用户使用外部服务登录(假设它是 Facebook),
应用程序从 Facebook 获取一些信息(名字和姓氏、电子邮件、出生日期等) 包含此信息的声明将添加到身份中。

2)我需要将此信息存储在应用程序数据库中,用于以下场景:

  • 管理员浏览注册用户列表
  • 电子邮件订阅服务将使用名字和姓氏
  • ...

  • 问题是用户是否会更新他/她的 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);

    身份验证 Controller

    外部登录回调:
    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 用户回来后更新传入的声明值。处理这种情况的真正方法是什么?
    谢谢。

    最佳答案

    这有点贵,但最简单的答案:

    您可以在用户登录时检查相同的信息,并在更改时更新它们。由于您与 Facebook 没有直接联系,因此您永远无法知道用户何时更改了他们的信息。

    这应该是一个不错的方法,除非您在一分钟内有数千次登录到您的系统。

    关于ASP.NET 标识 : Update external claims after authorization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28720475/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com