Обновление претензии пользователя не вступает в силу. Зачем?
Я использую ASP.NET MVC 5.1 с аутентификацией Owin и Claims.
После того как пользователь изменил свой адрес электронной почты, мне нужно обновить требования пользователей, поэтому я попытался в контроллере:
ClaimsIdentity identity = (ClaimsIdentity)User.Identity;
Claim claim = identity.FindFirst(ClaimTypes.Email);
identity.RemoveClaim(claim);
identity.AddClaim(new Claim(ClaimTypes.Email, newEmail));
IOwinContext context = new OwinContext();
context.Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);
context.Authentication.SignIn(identity);
Претензия изменена, но когда я обновляю страницу, претензии по электронной почте снова являются оригиналом...
Кажется, что cookie не обновляется. Любая идея, что я делаю неправильно?
И можно ли получить значение "IsPersistent" из идентификатора, поэтому, когда я его снова подпишу, у меня будет такое же значение?
Спасибо,
Мигель
Ответы
Ответ 1
У меня была такая же проблема, поэтому я просто хотел обобщить мои выводы здесь. Как говорит Крис, основа ответа действительно здесь: Как изменить файлы cookie cookie после изменения UserName текущего пользователя с идентификатором asp.net, но я нашел этот поток немного трудно следовать, и этот вопрос на самом деле не является прямым дубликатом.
Чтобы начать, получите AuthenticationManager из текущего контекста OWIN. После этого вы можете получить значение "isPersistent" (и другие свойства из исходного вызова SignIn
), вызвав метод AuthenticateAsync
. Затем, чтобы обновить утверждения текущего идентификатора пользователя, вам просто нужно заменить значение свойства AuthenticationResponseGrant
следующим образом:
var identity = (ClaimsIdentity)User.Identity;
// Call AddClaim, AddClaims or RemoveClaim on the user identity.
IOwinContext context = Request.GetOwinContext();
var authenticationContext =
await context.Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie);
if (authenticationContext != null)
{
authenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant(
identity,
authenticationContext.Properties);
}
Это окончательный параметр свойства AuthenticationResponseGrant
, который фактически обновляет файл cookie.
Надеюсь, это поможет другим читателям.
Ответ 2
Извините, это решение ASP.NET CORE
Я также оспаривал проблему с претензиями, но ответ был легко найти.
Чтобы обновить файл cookie, вы можете положиться на функцию RefreshSignInAsync() SignInManager;
private readonly UserManager<ApplicationUser> _userManager;
private readonly ApplicationDbContext _context;
private readonly SignInManager<ApplicationUser> _signInManager;
public ApiClubController(UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager, ApplicationDbContext context)
{
_userManager = userManager;
_context = context;
_signInManager = signInManager;
}
Внутри вашей функции:
//GET CURRENT USER
var usr = await GetCurrentUserAsync();
//OLD CLAIM
var myClaims = await _userManager.GetClaimsAsync(usr);
var oldClaim = myClaims.Where(o => o.Type.Equals("Club")).FirstOrDefault();
if (oldClaim != null)
{
await _userManager.RemoveClaimAsync(usr, oldClaim);
}
//CREATE CLUB CLAIM
var clubClaim = new Claim("Club", "" + id);
await _userManager.AddClaimAsync(usr, clubClaim);
//RESET USER COOKIE
await _signInManager.RefreshSignInAsync(usr);
//RETURN
return Ok(company);;
Примечание:
Я использую API здесь, потому что я много смешиваю с angular.
Если вы обновляете свою личность с помощью своего API, вам нужно обновить свою страницу, чтобы просматривать вещи на основе ваших требований.
Ответ 3
Это работает для меня. Не уверен, что это лучший способ, но обновленная заявка находится в БД и последующих контроллерах.
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
var c = identity.Claims.FirstOrDefault(r => r.Type == "tId");
await UserManager.RemoveClaimAsync(user.Id, c);
await UserManager.AddClaimAsync(user.Id, new Claim("tId", "9032C945-DC5C-4FC9-BE7C-8EDC83A72E58"));
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent }, identity);