Тайм-аут бэк-офиса Umbraco 60 с использованием 2FA и собственного менеджера пользователей и пользовательского магазина - PullRequest
0 голосов
/ 18 сентября 2018

Я создал 2FA для бэк-офиса Umbraco, используя собственный OwinStartup, UserManager и UserStore.Все работает отлично, за исключением того, что при входе в бэк-офис пользовательский сеанс прерывается ровно через 60 с каждый раз.Неважно, есть ли активность (щелчок по страницам и т. Д.), Он выгонит пользователя на страницу входа.

Стандартные настройки тайм-аута Umbraco все в порядке (20 минут), и, кроме того, если я использую UmbracoDefaultOwinStartup по умолчанию, тайм-аут не возникает, это только при использовании кода ниже.Тоже ничего в логах.

Есть идеи?Заранее спасибо

public class MfaOwinStartup : UmbracoDefaultOwinStartup
{
    protected override void ConfigureServices(IAppBuilder app)
    {
        app.SetUmbracoLoggerFactory();

        var applicationContext = ApplicationContext.Current;
        app.ConfigureUserManagerForUmbracoBackOffice<MfaUserManager, BackOfficeIdentityUser>(applicationContext, (options, context) => {
            var membershipProvider = Umbraco.Core.Security.MembershipProviderExtensions.GetUsersMembershipProvider().AsUmbracoMembershipProvider();

            var userManager = MfaUserManager.Create(options,
                applicationContext.Services.UserService,
                applicationContext.Services.EntityService,
                applicationContext.Services.ExternalLoginService,
                membershipProvider,
                UmbracoConfig.For.UmbracoSettings().Content);
            return userManager;
        });

        app.UseTwoFactorSignInCookie(global::Umbraco.Core.Constants.Security.BackOfficeTwoFactorAuthenticationType, TimeSpan.FromMinutes(25));
        app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);

    }

}

и

class MfaUserManager : BackOfficeUserManager, IUmbracoBackOfficeTwoFactorOptions
{
    public override bool SupportsUserTwoFactor => true;

    public MfaUserManager(IUserStore<BackOfficeIdentityUser, int> store) 
        : base(store)
    {
    }

    public static MfaUserManager Create(
        IdentityFactoryOptions<MfaUserManager> options,
        IUserService userService,
        IEntityService entitiyService,
        IExternalLoginService externalLoginService,
        MembershipProviderBase membershipProvider,
        IContentSection content)
    {
        var manager = new MfaUserManager(new MfaUserStore(userService, entitiyService, externalLoginService, membershipProvider));
        manager.InitUserManager(manager, membershipProvider, options.DataProtectionProvider, content);

        var dataProtectionProvider = options.DataProtectionProvider;
        manager.RegisterTwoFactorProvider("GoogleAuthenticator", new GoogleAuthenticatorProvider(dataProtectionProvider.Create("GoogleAuthenticator")));

        return manager;
    }

    public string GetTwoFactorView(IOwinContext owinContext, UmbracoContext umbracoContext, string username)
    {
        var user = ApplicationContext.Current.Services.UserService.GetByUsername(username);
        var u = MfaDb.GetUserMfa(user.Id);

        return "/umbraco/Plugin/Login/Index";
    }
}

и

public class MfaUserStore : BackOfficeUserStore
{
    public MfaUserStore(IUserService userService, IEntityService entitiyService, IExternalLoginService externalLoginService, 
        MembershipProviderBase usersMembershipProvider)
        : base(userService, entitiyService, externalLoginService, usersMembershipProvider)
    {

    }

    public override Task SetTwoFactorEnabledAsync(BackOfficeIdentityUser user, bool enabled)
    {
        user.TwoFactorEnabled = enabled;
        return Task.FromResult(0);
    }

    public override Task<bool> GetTwoFactorEnabledAsync(BackOfficeIdentityUser user)
    {
        var u = MfaDb.GetUserMfa(user.Id);
        if (u != null && u.IsEnabled)
        {
            return Task.FromResult(true);
        }
        return Task.FromResult(false);
    }
}

и

public class GoogleAuthenticatorProvider : DataProtectorTokenProvider<BackOfficeIdentityUser, int>, IUserTokenProvider<BackOfficeIdentityUser, int>
{
    public GoogleAuthenticatorProvider(IDataProtector protector)
        : base(protector)
    {
    }

    Task<bool> IUserTokenProvider<BackOfficeIdentityUser, int>.IsValidProviderForUserAsync(UserManager<BackOfficeIdentityUser, int> manager, 
        BackOfficeIdentityUser user)
    {
        var u = MfaDb.GetUserMfa(user.Id);
        return Task.FromResult(u != null && u.IsEnabled);
    }

    Task<bool> IUserTokenProvider<BackOfficeIdentityUser, int>.ValidateAsync(string purpose, string token, UserManager<BackOfficeIdentityUser, int> manager, 
        BackOfficeIdentityUser user)
    {
        var tfa = new TwoFactorAuthenticator();
        var u = MfaDb.GetUserMfa(user.Id);
        if (u == null) return Task.FromResult(false);

        var r = tfa.ValidateTwoFactorPIN(u.Key, token);

        return Task.FromResult(r);   
    }
}
...