Invalidate ClaimsPrincipal после того, как он был изменен - PullRequest
0 голосов
/ 13 февраля 2019

Я использую ASP.NET MVC, Identity2.

Я добавил "FirstName" Custom ClaimPrincipal:

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, long> manager)
{
    var userIdentity = await manager.CreateIdentityAsync(
                           this,
                           DefaultAuthenticationTypes.ApplicationCookie);

    // Add custom user claims here
    userIdentity.AddClaim(new Claim("FirstName", FirstName));

    return userIdentity;
}

Если я обновлю значение "FirstName", янеобходимо выйти и снова войти в систему, чтобы претензия «FirstName» была обновлена.Можно ли сделать недействительным утверждение «FirstName», поэтому его значение необходимо обновить?


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

1 Ответ

0 голосов
/ 14 февраля 2019

При просмотре встроенного шаблона MS я заметил, что они всегда звонят на SignInManager.SignInAsync, после изменения учетных данных пользователя (например, пароля, двухфакторной аутентификации и т. Д.).

Я также заметил, чтоClaims обновляются, как только пользователь выходит из системы и снова входит в систему ... поэтому после изменения "FirstName", которое хранится в Claim, я вызвал SignInManager.SignInAsync для повторной регистрации пользователя ... таким образом,Claims обновлены:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> UpdateFirstName(string firstName)
{
    var user = await UserManager.FindByIdAsync(User.Identity.GetUserId<long>());
    user.FirstName = firstName;

    // update FirstName which is stored in a Claim
    var result = await UserManager.UpdateAsync(user);

    if (result.Succeeded)
    {
        // re-signin the user, to refresh the Claims
        await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);

        // you need to redirect after calling SignInAsync, so claims are refreshed
        return RedirectToAction("Index"); 
    }

    // add some error message...
    return View();
}

Примечание: как показано в вопросе, я сохраняю Claims в Cookie.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...