Сброс пароля в Microsoft Identity вызывает System.Security.Cryptography.CryptographicException

Я использую MS Identity, и когда я использую токен сброса для сброса пароля, я получаю это исключение:

Тип внутреннего исключения: System.Security.Cryptography.CryptographicException Внутреннее исключение: операция защиты данных не удалась. Это могло быть вызвано тем, что профиль пользователя не был загружен для пользовательского контекста текущего потока, что может иметь место, когда поток олицетворяет себя.

Вот как выглядит код:

var TheProvider = new DpapiDataProtectionProvider();
UserManager<IdentityUser> TheUserManager = new UserManager<IdentityUser>(new UserStore<IdentityUser>());
TheUserManager.UserTokenProvider = new DataProtectorTokenProvider<IdentityUser>(TheProvider.Create("EmailConfirmation"));

string TheResetCode = TheUserManager.GeneratePasswordResetToken(TheUserMembershiptID);

IdentityResult TheResult = TheUserManager.ResetPassword(TheUserMembershiptID, TheResetCode, TheNewPassword);

То, что у меня есть, работает на моей локальной машине, но не когда я ставлю это на сервер. Я огляделся, но не нашел решения. Что мне нужно изменить, чтобы заставить его работать?


person frenchie    schedule 09.01.2017    source источник
comment
Есть ли причина создавать поставщика токенов вручную, как это? не использовать построенный фреймворком?   -  person trailmax    schedule 12.01.2017
comment
@trailmax: я открыт для всех вариантов.   -  person frenchie    schedule 12.01.2017
comment
В этом случае попробуйте следующее решение: tech.trailmax.info/2014/06/ посмотрите, не является ли это той же проблемой.   -  person trailmax    schedule 12.01.2017
comment
@frenchie ты используешь OWIN?   -  person Nkosi    schedule 13.01.2017
comment
Не создавайте поставщика вручную. получить его при запуске из приложения.   -  person Nkosi    schedule 13.01.2017
comment
Я не вижу ссылки на DbContext в коде примера. где вы сохраняете эти данные   -  person Nkosi    schedule 13.01.2017


Ответы (2)


Здесь предполагается, что вы используете как минимум версию 3 Identity вместе с OWIN и инфраструктурой сущностей.

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

public static class Auth {
    internal static IDataProtectionProvider DataProtectionProvider { get; private set; }
}

public partial class Startup {
    public void ConfigureAuth(IAppBuilder app) {
        Auth.DataProtectionProvider = app.GetDataProtectionProvider();
        //...other code removed for brevity
    }
}

Настройте DbContext для сохранения информации о членстве

public class MyIdentityDbContext : IdentityDbContext<IdentityUser> {
    public MyIdentityDbContext()
        : base("MembershipConnection") { }

    public static MyIdentityDbContext Create() {
        return new MyIdentityDbContext();
    }
}

Теперь создайте производный класс UserManager и настройте его для использования поставщика защиты данных.

public class IdentityUserManager : UserManager<IdentityUser> {

    private IdentityUserManager()
        : base(new UserStore<IdentityUser>(MyIdentityDbContext.Create())) {
        //...other code removed for brevity

        var dataProtectionProvider = Auth.DataProtectionProvider;
        if (dataProtectionProvider != null) {
            this.UserTokenProvider = new DataProtectorTokenProvider<IdentityUser>(dataProtectionProvider.Create("UserToken"));
        }
    }

    public static IdentityUserManager Create() {
        return new IdentityUserManager();
    }
}

Итак, теперь, если у вас есть пользователи, зарегистрированные в вашем постоянном хранилище, вы сможете сгенерировать свой токен и сбросить пароль.

var userManager = IdentityUserManager.Create();

var resetToken = await userManager.GeneratePasswordResetTokenAsync(id);

var result = await userManager.ResetPasswordAsync(id, resetToken, newPassword);

Теперь, основываясь на ваших комментариях в сообщении, вполне может быть, что Load User Profile на хосте (при условии, что IIS) необходимо установить на true.

Цитирование этого ответа

У меня были те же проблемы, за исключением того, что я размещался на amazon ec2. я смог решить эту проблему, перейдя в пул приложений в IIS и (в расширенных настройках после щелчка правой кнопкой мыши) установив модель процесса - загрузить профиль пользователя = true.

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

person Nkosi    schedule 13.01.2017
comment
Это оказалось решением. - person frenchie; 13.01.2017

Это проблема конфигурации с IIS. Перейдите к дополнительным настройкам пула приложений и установите для параметра «Загрузить профиль пользователя» значение True.

person Najkin    schedule 09.01.2017
comment
Я видел этот вариант как ответ в другом месте, но у меня нет доступа к IIS, это общий хостинг (пока). - person frenchie; 09.01.2017