Идентификация ASP.NET: обновление внешних утверждений после авторизации

Я использую ASP.NET Identity с несколькими внешними поставщиками входа в систему, и мне нужно обработать следующий сценарий:

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 вернется. Как правильно справиться с такой ситуацией? Спасибо.


person nativehr    schedule 25.02.2015    source источник
comment
Вы когда-нибудь это разбирали? Мне самому то же самое ...   -  person Mladen Mihajlovic    schedule 20.11.2016
comment
Я сам в такой же ситуации. Когда пользователь возвращается и вы входите в систему с помощью SignInManager.ExternalLoginSignInAsync (), он заполняет идентификатор утверждениями, которые вы сохранили в локальной учетной записи, что имеет смысл, но я не уверен, какой правильный способ обновить эти утверждения при последующих входах .   -  person rushinge    schedule 11.01.2017


Ответы (1)


Это немного дорого, но самый простой ответ:

Вы можете просто проверять одну и ту же информацию всякий раз, когда пользователь входит в систему, и обновлять их, если они были изменены. Поскольку у вас нет прямого подключения к Facebook, вы никогда не узнаете, когда пользователи меняют свою информацию.

В результате это должно быть нормальным подходом, если у вас нет тысяч входов в систему за минуту.

person Mithgroth    schedule 22.10.2018