[asp.net] Создание маркера пароля сброса не работает на Azure Website



Answers

Подумайте об использовании IAppBuilder.GetDataProtectionProvider() вместо объявления нового DpapiDataProtectionProvider .

Подобно вам, я ввел эту проблему, настроив свой UserManager, как это, из найденного кода:

public class UserManager : UserManager<ApplicationUser>
{
    public UserManager() : base(new UserStore<ApplicationUser>(new MyDbContext()))
    {
        // this does not work on azure!!!
        var provider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider("ASP.NET IDENTITY");
        this.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(provider.Create("EmailConfirmation"))
        {
            TokenLifespan = TimeSpan.FromHours(24),
        };
    }
}

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

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

    public void ConfigureAuth(IAppBuilder app)
    {
        DataProtectionProvider = app.GetDataProtectionProvider();
        // other stuff.
    }
}

... и затем ссылаясь на него из UserManager

public class UserManager : UserManager<ApplicationUser>
{
    public UserManager() : base(new UserStore<ApplicationUser>(new MyDbContext()))
    {
        var dataProtectionProvider = Startup.DataProtectionProvider;
        this.UserTokenProvider = 
                new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));

        // do other configuration
    }
}

Ответ от johnso также является хорошим примером того, как подключить его с помощью Autofac.

Question

Я выполняю функцию сброса пароля на своем сайте, используя встроенный класс UserManager который поставляется с ASP.NET 5.

Все отлично работает в моей среде разработчиков. Однако, как только я попробую его на рабочем сайте, который работает как веб-сайт Azure, я получаю следующее исключение:

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

Вот как я настраиваю экземпляр UserManager :

var provider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider(SiteConfig.SiteName);
UserManager.UserTokenProvider = new Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider<User>(provider.Create(ResetPasswordPurpose));

Затем я генерирую маркер таким образом (для отправки пользователю по электронной почте, чтобы они могли проверить, действительно ли они хотят сбросить свой пароль):

string token = UserManager.GeneratePasswordResetToken(user.Id);

К сожалению, когда это работает на Azure, я получаю исключение выше.

Я объединился и нашел это возможное решение . Однако это не сработало, и я все равно получаю такое же исключение.

Согласно ссылке, это имеет какое-то отношение к токенам сеанса, которые не работают на веб-ферме, такой как Azure.




У меня была та же проблема ( Owin.Security.DataProtection.DpapiDataProtectionProvider не работает при Owin.Security.DataProtection.DpapiDataProtectionProvider Azure), а Staley верен, вы не можете использовать DpapiDataProtectionProvider .

Если вы используете стартовые классы OWIN, вы можете не IDataProtectionProvider свой собственный IDataProtectionProvider , а использовать метод IAppBuilder для IAppBuilder .

Например, с Autofac:

internal static IDataProtectionProvider DataProtectionProvider;    

public void ConfigureAuth(IAppBuilder app)
{
    // ...

    DataProtectionProvider = app.GetDataProtectionProvider();

    builder.Register<IDataProtectionProvider>(c => DataProtectionProvider)
        .InstancePerLifetimeScope();

    // ...
}



Related