Как изменить файлы cookie аутентификации после изменения имени пользователя текущего пользователя с идентификатором asp.net

Использование удостоверения asp.net версии 1.0.0-rc1 с Entity Framework 6.0.0-rc1 (те, которые поставляются с Visual Studio 2013 RC).

Попытка дать пользователям возможность изменить свои UserName. Кажется, для этого нет функции под AuthenticationIdentityManager, поэтому я меняю данные с помощью EF (получаю объект пользователя для текущего пользователя, меняю имя пользователя и сохраняю изменения).

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

В прошлом при проверке подлинности с помощью форм я использовал следующий код для решения этой проблемы.

var formsAuthCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
var isPersistent = FormsAuthentication.Decrypt(formsAuthCookie.Value).IsPersistent;
FormsAuthentication.SetAuthCookie(newUserName, isPersistent);

Что мне делать с идентификатором asp.net, чтобы обновить файлы cookie?

ОБНОВЛЕНИЕ

Следующий код, кажется, обновляет файл 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 аутентификации?


person aleyush    schedule 13.10.2013    source источник


Ответы (1)


Как вы входите/аутентифицируете пользователя с битами Asp.Net MVC5 RTM, используя 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;
}
person jd4u    schedule 14.10.2013
comment
Этот код может работать для RTM (еще не широко доступен). В RC1 нет DefaultAuthenticationTypes и UserManager.CreateIdentityAsync(). - person aleyush; 14.10.2013
comment
Второй вопрос: как я могу получить текущее значение IsPersistent (моя цель — просто изменить имя пользователя, а не что-то еще)? - person aleyush; 14.10.2013
comment
Перед выпуском VS2013 рекомендуется сохранить пробные версии с ночной сборкой. В нескольких комментариях разработчиков говорится, что многие классы RC1 недоступны в RTM, которая будет выпущена вместе с VS2013 в ноябре. - person jd4u; 14.10.2013
comment
Я обновился до ночных сборок, но проблема все еще здесь: как я могу получить текущее значение IsPersistent? - person aleyush; 15.10.2013
comment
Ваше последнее обновление помогло (изменил Bearer на DefaultAuthenticationTypes.ExternalCookie). Отмечено как ответ. - person aleyush; 17.10.2013
comment
Важно: в более поздних проектах OWIN в коде шаблона по умолчанию используется DefaultAuthenticationTypes.ApplicationCookie, а не DefaultAuthenticationTypes.ExternalCookie, что сделает все вышеперечисленное фактически бесполезным, если вы не сможете поменять местами эту небольшую деталь в своем коде. - person Chris Moschini; 07.02.2018