Как изменить файлы cookie для проверки подлинности после изменения UserName текущего пользователя с идентификатором asp.net
Использование asp.net identity version 1.0.0-rc1 с Entity Framework 6.0.0-rc1 (те, которые поставляются с Visual Studio 2013 RC).
Попытка дать пользователям возможность изменить их UserName
.
Кажется, нет функции для этого в AuthenticationIdentityManager
, поэтому я изменяю данные с помощью EF (получаю пользовательский объект для текущего пользователя, изменяю UserName и сохраняю изменения).
Проблема заключается в том, что файлы cookie для проверки подлинности остаются неизменными, а следующий запрос завершается с ошибкой, поскольку такого пользователя нет.
С проверкой подлинности форм в прошлом я использовал следующий код для решения этой проблемы.
var formsAuthCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
var isPersistent = FormsAuthentication.Decrypt(formsAuthCookie.Value).IsPersistent;
FormsAuthentication.SetAuthCookie(newUserName, isPersistent);
Что мне делать с идентификатором asp.net для обновления файлов cookie?
UPDATE
Следующий код, похоже, обновляет файл cookie аутентификации.
var identity = new ClaimsIdentity(User.Identity);
identity.RemoveClaim(identity.FindFirst(identity.NameClaimType));
identity.AddClaim(new Claim(identity.NameClaimType, newUserName));
AuthenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant
(new ClaimsPrincipal(identity), new AuthenticationProperties {IsPersistent = false});
Остальная проблема заключается в следующем: как извлечь IsPersistent
значение из текущего файла cookie проверки подлинности?
Ответы
Ответ 1
Как вы входите в систему/аутентифицируете пользователя с битами RTM Asp.Net MVC5, используя AspNet.Identity?
private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
}
Для RC1 вы можете использовать аналогичный код.
AuthenticationManager.SignOut();
IdentityManager.Authentication.SignIn(AuthenticationManager, user.UserId, isPersistent:false);
Для постоянного значения вам необходимо получить доступ к файлу cookie аутентификации и получить статус.
Обновлено:
Используйте соответствующий AuthenticationType, используемый вместо "Bearer". Также убедитесь, что при выдаче билета входа вы устанавливаете AuthenticationProperties.IsPersistent.
bool isPersistent=false;
var authContext = await Authentication.AuthenticateAsync("Bearer");
if (authContext != null)
{
var aProperties = authContext.Properties;
isPersistent = aProperties.IsPersistent;
}