我正在尝试捕获Umbraco用户的登录事件(在CMS中登录)。
我尝试从MembersMembershipProvider
扩展并覆盖ValidateUser
方法。我还更改了web.config以使用我的类。
当我在这个覆盖的方法中放置一个断点时,它不会停止并像往常一样登录用户。
public class CustomUmbracoMembershipProvider : Umbraco.Web.Security.Providers.UsersMembershipProvider
{
public override bool ValidateUser(string username, string password)
{
return base.ValidateUser(username, password);
}
}
提前致谢。
答案 0 :(得分:1)
正如Jannik所说,Umbraco在最新的几个版本中使用ASP.NET Identity,因此MembershipProvider不再用于验证和验证用户。
经过几个小时的研究,我发现了一种解决方案:
1º - 创建自定义UserManager,并覆盖方法CheckPasswordAsync:
public class CustomBackOfficeUserManager : BackOfficeUserManager
{
public CustomBackOfficeUserManager(
IUserStore<BackOfficeIdentityUser, int> store,
IdentityFactoryOptions<BackOfficeUserManager> options,
MembershipProviderBase membershipProvider) :
base(store, options, membershipProvider)
{
}
/// <summary>
/// Returns true if the password is valid for the user
/// </summary>
/// <param name="user"/><param name="password"/>
/// <returns/>
public override Task<bool> CheckPasswordAsync(BackOfficeIdentityUser user, string password)
{
//Your implementation
var result = base.CheckPasswordAsync(user, password).Result;
return Task.FromResult(result);
}
}
2º - 然后在你的owin启动中,你可以使用这个代码块来配置你的ConfigureUserManagerForUmbracoBackOffice:
var appCtx = ApplicationContext;
app.ConfigureUserManagerForUmbracoBackOffice<BackOfficeUserManager, BackOfficeIdentityUser>(
appCtx,
(options, context) =>
{
var membershipProvider = MembershipProviderExtensions.GetUsersMembershipProvider().AsUmbracoMembershipProvider();
var store = new BackOfficeUserStore(
appCtx.Services.UserService,
appCtx.Services.ExternalLoginService,
membershipProvider);
return new CustomBackOfficeUserManager(store, options, membershipProvider);
});
此解决方案继续使用umbraco UserStore和UserManager的基本方法。
答案 1 :(得分:0)
由于Umbraco后端在最新版本中使用ASP.NET身份,因此询问您使用的确切版本可能也是相关的。
我认为ASP.NET Identity有一个OnLoggedIn事件,您可以尝试:https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.login.onloggedin.aspx
但我并非100%确定该链接是最新的。
答案 2 :(得分:0)
我有类似的情况。这在Umbraco 7.6.5中对我有用。我知道它不优雅。这只是一种解决方法:
public class MyCustomEvents: ApplicationEventHandler
{
protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
base.ApplicationStarted(umbracoApplication, applicationContext);
UserService.SavedUser += UserServiceSaved;
}
private void UserServiceSaved(IUserService sender, SaveEventArgs<IUser> e)
{
foreach(IUser user in e.SavedEntities)
{
if (!user.IsNewEntity()) //Is not creating a new user
{
IUser alreadyLoggedUser = UmbracoContext.Current.Security.CurrentUser;
if (alreadyLoggedUser == null) //Is not a user management via backoffice
{
if (user.FailedPasswordAttempts == 0) //Is a successful login?
{
DateTime justNow = DateTime.Now.AddSeconds(-5);
if (user.LastLoginDate.CompareTo(justNow) >= 0) //Logged in just now?
{
//Do your stuff
}
}
}
}
}
}
}