Я создал 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);
}
}