Fixes a lot -
U4-3208 Ensure all membership provider properties exist on the default Member type shipped with Umbraco U4-3158 user back office password policies doesn't adhere to membership provider rules and even more fixes to the membership provider like actually integrating the last locked out date and last pword change date. Fixes member creation to actually use the membership provider - this means that the password is created properly based on the provider config. Fixes the provider to have default fields specified so people don't actually have to specify in config.
This commit is contained in:
@@ -9,7 +9,7 @@ namespace Umbraco.Core.Models.Rdbms
|
|||||||
internal class PropertyTypeDto
|
internal class PropertyTypeDto
|
||||||
{
|
{
|
||||||
[Column("id")]
|
[Column("id")]
|
||||||
[PrimaryKeyColumn(IdentitySeed = 28)]
|
[PrimaryKeyColumn(IdentitySeed = 50)]
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
[Column("dataTypeId")]
|
[Column("dataTypeId")]
|
||||||
|
|||||||
@@ -189,6 +189,8 @@ namespace Umbraco.Core.Persistence.Migrations.Initial
|
|||||||
_database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 3, ContentTypeNodeId = 1032, Text = "Image", SortOrder = 1 });
|
_database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 3, ContentTypeNodeId = 1032, Text = "Image", SortOrder = 1 });
|
||||||
_database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 4, ContentTypeNodeId = 1033, Text = "File", SortOrder = 1 });
|
_database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 4, ContentTypeNodeId = 1033, Text = "File", SortOrder = 1 });
|
||||||
_database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 5, ContentTypeNodeId = 1031, Text = "Contents", SortOrder = 1 });
|
_database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 5, ContentTypeNodeId = 1031, Text = "Contents", SortOrder = 1 });
|
||||||
|
//membership property group
|
||||||
|
_database.Insert("cmsPropertyTypeGroup", "id", false, new PropertyTypeGroupDto { Id = 11, ContentTypeNodeId = 1044, Text = "Membership", SortOrder = 1 });
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CreateCmsPropertyTypeData()
|
private void CreateCmsPropertyTypeData()
|
||||||
@@ -202,6 +204,19 @@ namespace Umbraco.Core.Persistence.Migrations.Initial
|
|||||||
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 25, DataTypeId = -92, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = Constants.Conventions.Media.Extension, Name = "Type", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null });
|
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 25, DataTypeId = -92, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = Constants.Conventions.Media.Extension, Name = "Type", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null });
|
||||||
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 26, DataTypeId = -92, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = Constants.Conventions.Media.Bytes, Name = "Size", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null });
|
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 26, DataTypeId = -92, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = Constants.Conventions.Media.Bytes, Name = "Size", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null });
|
||||||
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 27, DataTypeId = -38, ContentTypeId = 1031, PropertyTypeGroupId = 5, Alias = "contents", Name = "Contents:", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null });
|
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 27, DataTypeId = -38, ContentTypeId = 1031, PropertyTypeGroupId = 5, Alias = "contents", Name = "Contents:", HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null });
|
||||||
|
//membership property types
|
||||||
|
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 28, DataTypeId = -89, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.Comments, Name = Constants.Conventions.Member.CommentsLabel, HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null });
|
||||||
|
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 29, DataTypeId = -92, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.FailedPasswordAttempts, Name = Constants.Conventions.Member.FailedPasswordAttemptsLabel, HelpText = null, SortOrder = 1, Mandatory = false, ValidationRegExp = null, Description = null });
|
||||||
|
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 30, DataTypeId = -49, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.IsApproved, Name = Constants.Conventions.Member.IsApprovedLabel, HelpText = null, SortOrder = 2, Mandatory = false, ValidationRegExp = null, Description = null });
|
||||||
|
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 31, DataTypeId = -49, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.IsLockedOut, Name = Constants.Conventions.Member.IsLockedOutLabel, HelpText = null, SortOrder = 3, Mandatory = false, ValidationRegExp = null, Description = null });
|
||||||
|
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 32, DataTypeId = -92, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.LastLockoutDate, Name = Constants.Conventions.Member.LastLockoutDateLabel, HelpText = null, SortOrder = 4, Mandatory = false, ValidationRegExp = null, Description = null });
|
||||||
|
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 33, DataTypeId = -92, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.LastLoginDate, Name = Constants.Conventions.Member.LastLoginDateLabel, HelpText = null, SortOrder = 5, Mandatory = false, ValidationRegExp = null, Description = null });
|
||||||
|
_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 34, DataTypeId = -92, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.LastPasswordChangeDate, Name = Constants.Conventions.Member.LastPasswordChangeDateLabel, HelpText = null, SortOrder = 6, Mandatory = false, ValidationRegExp = null, Description = null });
|
||||||
|
|
||||||
|
//TODO: The member editor doesn't currently support providers that have question/answer so we'll leave these out for now.
|
||||||
|
// Also, it's worth noting that the built in ASP.Net providers encrypt the answer so that admins cannot see it for added security which is something we should actually do!
|
||||||
|
//_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 35, DataTypeId = -92, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.PasswordAnswer, Name = Constants.Conventions.Member.PasswordAnswerLabel, HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null });
|
||||||
|
//_database.Insert("cmsPropertyType", "id", false, new PropertyTypeDto { Id = 36, DataTypeId = -92, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.PasswordQuestion, Name = Constants.Conventions.Member.PasswordQuestionLabel, HelpText = null, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null });
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CreateUmbracoLanguageData()
|
private void CreateUmbracoLanguageData()
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ NOTES:
|
|||||||
* Compression/Combination/Minification is not enabled unless debug="false" is specified on the 'compiliation' element in the web.config
|
* Compression/Combination/Minification is not enabled unless debug="false" is specified on the 'compiliation' element in the web.config
|
||||||
* A new version will invalidate both client and server cache and create new persisted files
|
* A new version will invalidate both client and server cache and create new persisted files
|
||||||
-->
|
-->
|
||||||
<clientDependency version="9" fileDependencyExtensions=".js,.css" loggerType="Umbraco.Web.UI.CdfLogger, umbraco">
|
<clientDependency version="11" fileDependencyExtensions=".js,.css" loggerType="Umbraco.Web.UI.CdfLogger, umbraco">
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
This section is used for Web Forms only, the enableCompositeFiles="true" is optional and by default is set to true.
|
This section is used for Web Forms only, the enableCompositeFiles="true" is optional and by default is set to true.
|
||||||
|
|||||||
@@ -15,6 +15,19 @@ namespace Umbraco.Web.UI.Install.Steps
|
|||||||
public partial class DefaultUser : StepUserControl
|
public partial class DefaultUser : StepUserControl
|
||||||
{
|
{
|
||||||
|
|
||||||
|
protected MembershipProvider CurrentProvider
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var provider = Membership.Providers[UmbracoSettings.DefaultBackofficeProvider];
|
||||||
|
if (provider == null)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("No MembershipProvider found with name " + UmbracoSettings.DefaultBackofficeProvider);
|
||||||
|
}
|
||||||
|
return provider;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected void ChangePasswordClick(object sender, System.EventArgs e)
|
protected void ChangePasswordClick(object sender, System.EventArgs e)
|
||||||
{
|
{
|
||||||
Page.Validate();
|
Page.Validate();
|
||||||
@@ -22,16 +35,37 @@ namespace Umbraco.Web.UI.Install.Steps
|
|||||||
if (Page.IsValid)
|
if (Page.IsValid)
|
||||||
{
|
{
|
||||||
var u = User.GetUser(0);
|
var u = User.GetUser(0);
|
||||||
var user = Membership.Providers[UmbracoSettings.DefaultBackofficeProvider].GetUser(0, true);
|
var user = CurrentProvider.GetUser(0, true);
|
||||||
user.ChangePassword(u.GetPassword(), tb_password.Text.Trim());
|
if (user == null)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("No user found in membership provider with id of 0");
|
||||||
|
}
|
||||||
|
|
||||||
|
//NOTE: This will throw an exception if the membership provider
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var success = user.ChangePassword(u.GetPassword(), tb_password.Text.Trim());
|
||||||
|
if (!success)
|
||||||
|
{
|
||||||
|
PasswordValidator.IsValid = false;
|
||||||
|
PasswordValidator.ErrorMessage = "Password must be at least " + CurrentProvider.MinRequiredPasswordLength + " characters long and contain at least " + CurrentProvider.MinRequiredNonAlphanumericCharacters + " symbols";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
PasswordValidator.IsValid = false;
|
||||||
|
PasswordValidator.ErrorMessage = "Password must be at least " + CurrentProvider.MinRequiredPasswordLength + " characters long and contain at least " + CurrentProvider.MinRequiredNonAlphanumericCharacters + " symbols";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Is it using the default membership provider
|
// Is it using the default membership provider
|
||||||
if (Membership.Providers[UmbracoSettings.DefaultBackofficeProvider] is UsersMembershipProvider)
|
if (CurrentProvider is UsersMembershipProvider)
|
||||||
{
|
{
|
||||||
// Save user in membership provider
|
// Save user in membership provider
|
||||||
var umbracoUser = user as UsersMembershipUser;
|
var umbracoUser = user as UsersMembershipUser;
|
||||||
umbracoUser.FullName = tb_name.Text.Trim();
|
umbracoUser.FullName = tb_name.Text.Trim();
|
||||||
Membership.Providers[UmbracoSettings.DefaultBackofficeProvider].UpdateUser(umbracoUser);
|
CurrentProvider.UpdateUser(umbracoUser);
|
||||||
|
|
||||||
// Save user details
|
// Save user details
|
||||||
u.Email = tb_email.Text.Trim();
|
u.Email = tb_email.Text.Trim();
|
||||||
@@ -39,7 +73,10 @@ namespace Umbraco.Web.UI.Install.Steps
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
u.Name = tb_name.Text.Trim();
|
u.Name = tb_name.Text.Trim();
|
||||||
if (!(Membership.Providers[UmbracoSettings.DefaultBackofficeProvider] is ActiveDirectoryMembershipProvider)) Membership.Providers[UmbracoSettings.DefaultBackofficeProvider].UpdateUser(user);
|
if ((CurrentProvider is ActiveDirectoryMembershipProvider) == false)
|
||||||
|
{
|
||||||
|
CurrentProvider.UpdateUser(user);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// we need to update the login name here as it's set to the old name when saving the user via the membership provider!
|
// we need to update the login name here as it's set to the old name when saving the user via the membership provider!
|
||||||
|
|||||||
@@ -57,6 +57,15 @@ namespace Umbraco.Web.UI.Install.Steps {
|
|||||||
/// </remarks>
|
/// </remarks>
|
||||||
protected global::System.Web.UI.WebControls.TextBox tb_password;
|
protected global::System.Web.UI.WebControls.TextBox tb_password;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// PasswordValidator control.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Auto-generated field.
|
||||||
|
/// To modify move field declaration from designer file to code-behind file.
|
||||||
|
/// </remarks>
|
||||||
|
protected global::System.Web.UI.WebControls.CustomValidator PasswordValidator;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// tb_password_confirm control.
|
/// tb_password_confirm control.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -47,6 +47,7 @@
|
|||||||
<asp:label AssociatedControlID="tb_password" runat="server">Password:</asp:label>
|
<asp:label AssociatedControlID="tb_password" runat="server">Password:</asp:label>
|
||||||
<span><asp:TextBox ID="tb_password" CssClass="text" TextMode="Password" type="text" Text="" runat="server" /></span>
|
<span><asp:TextBox ID="tb_password" CssClass="text" TextMode="Password" type="text" Text="" runat="server" /></span>
|
||||||
<asp:RequiredFieldValidator Display="Dynamic" CssClass="invalidaing" ControlToValidate="tb_password" runat="server" ErrorMessage="Password is a mandatory field" />
|
<asp:RequiredFieldValidator Display="Dynamic" CssClass="invalidaing" ControlToValidate="tb_password" runat="server" ErrorMessage="Password is a mandatory field" />
|
||||||
|
<asp:CustomValidator ID="PasswordValidator" Display="Dynamic" CssClass="invalidaing" runat="server" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -79,7 +80,8 @@
|
|||||||
badPass: "invalidaing",
|
badPass: "invalidaing",
|
||||||
goodPass: "validaing",
|
goodPass: "validaing",
|
||||||
strongPass: "validaing",
|
strongPass: "validaing",
|
||||||
baseStyle: "basevalidaing",
|
baseStyle: "basevalidaing",
|
||||||
|
minLength: <%=CurrentProvider.MinRequiredPasswordLength %>,
|
||||||
userid: jQuery("#<%= tb_login.ClientID %>").val(),
|
userid: jQuery("#<%= tb_login.ClientID %>").val(),
|
||||||
messageloc: 1
|
messageloc: 1
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -47,7 +47,8 @@
|
|||||||
strongPass: 'strongPass', //optional
|
strongPass: 'strongPass', //optional
|
||||||
baseStyle: 'testresult', //optional
|
baseStyle: 'testresult', //optional
|
||||||
userid: '', //required override
|
userid: '', //required override
|
||||||
messageloc: 1 //before == 0 or after == 1
|
messageloc: 1, //before == 0 or after == 1
|
||||||
|
minLength: 7
|
||||||
};
|
};
|
||||||
var opts = $.extend(defaults, options);
|
var opts = $.extend(defaults, options);
|
||||||
|
|
||||||
@@ -75,8 +76,8 @@
|
|||||||
$.fn.teststrength = function (password, username, option) {
|
$.fn.teststrength = function (password, username, option) {
|
||||||
var score = 0;
|
var score = 0;
|
||||||
|
|
||||||
//password < 4
|
//password < minLength
|
||||||
if (password.length < 4) { this.resultStyle = option.shortPass; return $(this).shortPass; }
|
if (password.length < option.minLength) { this.resultStyle = option.shortPass; return $(this).shortPass; }
|
||||||
|
|
||||||
//password == user name
|
//password == user name
|
||||||
if (password.toLowerCase() == username.toLowerCase()) { this.resultStyle = option.badPass; return $(this).samePassword; }
|
if (password.toLowerCase() == username.toLowerCase()) { this.resultStyle = option.badPass; return $(this).samePassword; }
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
|
using System.Globalization;
|
||||||
using System.Web.Security;
|
using System.Web.Security;
|
||||||
using umbraco.BusinessLogic;
|
using umbraco.BusinessLogic;
|
||||||
using umbraco.DataLayer;
|
using umbraco.DataLayer;
|
||||||
@@ -74,25 +75,30 @@ namespace umbraco
|
|||||||
string email = nameAndMail.Length > 0 ? nameAndMail[1] : "";
|
string email = nameAndMail.Length > 0 ? nameAndMail[1] : "";
|
||||||
string password = nameAndMail.Length > 1 ? nameAndMail[2] : "";
|
string password = nameAndMail.Length > 1 ? nameAndMail[2] : "";
|
||||||
string loginName = nameAndMail.Length > 2 ? nameAndMail[3] : "";
|
string loginName = nameAndMail.Length > 2 ? nameAndMail[3] : "";
|
||||||
if (cms.businesslogic.member.Member.InUmbracoMemberMode() && TypeID != -1)
|
if (Member.InUmbracoMemberMode() && TypeID != -1)
|
||||||
{
|
{
|
||||||
cms.businesslogic.member.MemberType dt = new cms.businesslogic.member.MemberType(TypeID);
|
var dt = new MemberType(TypeID);
|
||||||
cms.businesslogic.member.Member m = cms.businesslogic.member.Member.MakeNew(name, loginName, email, dt, BusinessLogic.User.GetUser(_userID));
|
var provider = (providers.members.UmbracoMembershipProvider) Membership.Provider;
|
||||||
m.Password = password;
|
MembershipCreateStatus status;
|
||||||
m.LoginName = loginName.Replace(" ", "").ToLower();
|
//TODO: We are not supporting q/a - passing in empty here
|
||||||
|
var created = provider.CreateUser(dt.Alias,
|
||||||
|
loginName.Replace(" ", "").ToLower(), //dunno why we're doing this but that's how it has been so i'll leave it i guess
|
||||||
|
password, email, "", "", true, Guid.NewGuid(), out status);
|
||||||
|
|
||||||
NewMemberUIEventArgs e = new NewMemberUIEventArgs();
|
var member = Member.GetMemberFromLoginName(created.UserName);
|
||||||
this.OnNewMember(e, password, m);
|
|
||||||
|
|
||||||
_returnUrl = "members/editMember.aspx?id=" + m.Id.ToString();
|
var e = new NewMemberUIEventArgs();
|
||||||
|
this.OnNewMember(e, password, member);
|
||||||
|
|
||||||
|
_returnUrl = "members/editMember.aspx?id=" + member.Id.ToString(CultureInfo.InvariantCulture);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MembershipCreateStatus mc = new MembershipCreateStatus();
|
var mc = new MembershipCreateStatus();
|
||||||
Membership.CreateUser(name, password, email, "empty", "empty", true, out mc);
|
Membership.CreateUser(name, password, email, "empty", "empty", true, out mc);
|
||||||
if (mc != MembershipCreateStatus.Success)
|
if (mc != MembershipCreateStatus.Success)
|
||||||
{
|
{
|
||||||
throw new Exception("Error creating Member: " + mc.ToString());
|
throw new Exception("Error creating Member: " + mc);
|
||||||
}
|
}
|
||||||
_returnUrl = "members/editMember.aspx?id=" + System.Web.HttpContext.Current.Server.UrlEncode(name);
|
_returnUrl = "members/editMember.aspx?id=" + System.Web.HttpContext.Current.Server.UrlEncode(name);
|
||||||
}
|
}
|
||||||
@@ -102,10 +108,8 @@ namespace umbraco
|
|||||||
|
|
||||||
public bool Delete()
|
public bool Delete()
|
||||||
{
|
{
|
||||||
//cms.businesslogic.member.Member d = new cms.businesslogic.member.Member(ParentID);
|
var u = Membership.GetUser(Alias);
|
||||||
//d.delete();
|
if (u == null) return false;
|
||||||
//return true;
|
|
||||||
MembershipUser u = Membership.GetUser(Alias);
|
|
||||||
Membership.DeleteUser(u.UserName, true);
|
Membership.DeleteUser(u.UserName, true);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|||||||
@@ -31,16 +31,21 @@ namespace umbraco.providers.members
|
|||||||
public class UmbracoMembershipProvider : MembershipProviderBase
|
public class UmbracoMembershipProvider : MembershipProviderBase
|
||||||
{
|
{
|
||||||
#region Fields
|
#region Fields
|
||||||
|
|
||||||
|
//Set the defaults!
|
||||||
|
private string _defaultMemberTypeAlias = "Member";
|
||||||
|
private string _lockPropertyTypeAlias = Constants.Conventions.Member.IsLockedOut;
|
||||||
|
private string _lastLockedOutPropertyTypeAlias = Constants.Conventions.Member.LastLockoutDate;
|
||||||
|
private string _failedPasswordAttemptsPropertyTypeAlias = Constants.Conventions.Member.FailedPasswordAttempts;
|
||||||
|
private string _approvedPropertyTypeAlias = Constants.Conventions.Member.IsApproved;
|
||||||
|
private string _commentPropertyTypeAlias = Constants.Conventions.Member.Comments;
|
||||||
|
private string _lastLoginPropertyTypeAlias = Constants.Conventions.Member.LastLoginDate;
|
||||||
|
private string _lastPasswordChangedPropertyTypeAlias = Constants.Conventions.Member.LastPasswordChangeDate;
|
||||||
|
private string _passwordRetrievalQuestionPropertyTypeAlias = Constants.Conventions.Member.PasswordQuestion;
|
||||||
|
private string _passwordRetrievalAnswerPropertyTypeAlias = Constants.Conventions.Member.PasswordAnswer;
|
||||||
|
|
||||||
private string _defaultMemberTypeAlias;
|
|
||||||
private string _lockPropertyTypeAlias;
|
|
||||||
private string _failedPasswordAttemptsPropertyTypeAlias;
|
|
||||||
private string _approvedPropertyTypeAlias;
|
|
||||||
private string _commentPropertyTypeAlias;
|
|
||||||
private string _lastLoginPropertyTypeAlias;
|
|
||||||
private string _passwordRetrievalQuestionPropertyTypeAlias;
|
|
||||||
private string _passwordRetrievalAnswerPropertyTypeAlias;
|
|
||||||
private string _providerName = Member.UmbracoMemberProviderName;
|
private string _providerName = Member.UmbracoMemberProviderName;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Initialization Method
|
#region Initialization Method
|
||||||
@@ -83,6 +88,14 @@ namespace umbraco.providers.members
|
|||||||
{
|
{
|
||||||
_lockPropertyTypeAlias = config["umbracoLockPropertyTypeAlias"];
|
_lockPropertyTypeAlias = config["umbracoLockPropertyTypeAlias"];
|
||||||
}
|
}
|
||||||
|
if (config["umbracoLastLockedPropertyTypeAlias"] != null)
|
||||||
|
{
|
||||||
|
_lastLockedOutPropertyTypeAlias = config["umbracoLastLockedPropertyTypeAlias"];
|
||||||
|
}
|
||||||
|
if (config["umbracoLastPasswordChangedPropertyTypeAlias"] != null)
|
||||||
|
{
|
||||||
|
_lastPasswordChangedPropertyTypeAlias = config["umbracoLastPasswordChangedPropertyTypeAlias"];
|
||||||
|
}
|
||||||
if (config["umbracoFailedPasswordAttemptsPropertyTypeAlias"] != null)
|
if (config["umbracoFailedPasswordAttemptsPropertyTypeAlias"] != null)
|
||||||
{
|
{
|
||||||
_failedPasswordAttemptsPropertyTypeAlias = config["umbracoFailedPasswordAttemptsPropertyTypeAlias"];
|
_failedPasswordAttemptsPropertyTypeAlias = config["umbracoFailedPasswordAttemptsPropertyTypeAlias"];
|
||||||
@@ -140,7 +153,9 @@ namespace umbraco.providers.members
|
|||||||
string salt;
|
string salt;
|
||||||
var encodedPassword = EncryptOrHashNewPassword(newPassword, out salt);
|
var encodedPassword = EncryptOrHashNewPassword(newPassword, out salt);
|
||||||
m.ChangePassword(
|
m.ChangePassword(
|
||||||
FormatPasswordForStorage(encodedPassword, salt));
|
FormatPasswordForStorage(encodedPassword, salt));
|
||||||
|
|
||||||
|
UpdateMemberProperty(m, _lastPasswordChangedPropertyTypeAlias, DateTime.Now);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -246,7 +261,7 @@ namespace umbraco.providers.members
|
|||||||
UpdateMemberProperty(m, _passwordRetrievalAnswerPropertyTypeAlias, passwordAnswer);
|
UpdateMemberProperty(m, _passwordRetrievalAnswerPropertyTypeAlias, passwordAnswer);
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(_approvedPropertyTypeAlias) == false)
|
if (string.IsNullOrEmpty(_approvedPropertyTypeAlias) == false)
|
||||||
UpdateMemberProperty(m, _approvedPropertyTypeAlias, isApproved);
|
UpdateMemberProperty(m, _approvedPropertyTypeAlias, isApproved ? 1 : 0);
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(_lastLoginPropertyTypeAlias) == false)
|
if (string.IsNullOrEmpty(_lastLoginPropertyTypeAlias) == false)
|
||||||
{
|
{
|
||||||
@@ -254,6 +269,11 @@ namespace umbraco.providers.members
|
|||||||
UpdateMemberProperty(m, _lastLoginPropertyTypeAlias, mUser.LastActivityDate);
|
UpdateMemberProperty(m, _lastLoginPropertyTypeAlias, mUser.LastActivityDate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(_lastPasswordChangedPropertyTypeAlias) == false)
|
||||||
|
{
|
||||||
|
UpdateMemberProperty(m, _lastPasswordChangedPropertyTypeAlias, DateTime.Now);
|
||||||
|
}
|
||||||
|
|
||||||
// save
|
// save
|
||||||
m.Save();
|
m.Save();
|
||||||
|
|
||||||
@@ -294,13 +314,10 @@ namespace umbraco.providers.members
|
|||||||
/// </returns>
|
/// </returns>
|
||||||
public override bool DeleteUser(string username, bool deleteAllRelatedData)
|
public override bool DeleteUser(string username, bool deleteAllRelatedData)
|
||||||
{
|
{
|
||||||
Member m = Member.GetMemberFromLoginName(username);
|
var m = Member.GetMemberFromLoginName(username);
|
||||||
if (m == null) return false;
|
if (m == null) return false;
|
||||||
else
|
m.delete();
|
||||||
{
|
return true;
|
||||||
m.delete();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -339,14 +356,14 @@ namespace umbraco.providers.members
|
|||||||
/// </returns>
|
/// </returns>
|
||||||
public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
|
public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
|
||||||
{
|
{
|
||||||
int counter = 0;
|
var counter = 0;
|
||||||
int startIndex = pageSize * pageIndex;
|
var startIndex = pageSize * pageIndex;
|
||||||
int endIndex = startIndex + pageSize - 1;
|
var endIndex = startIndex + pageSize - 1;
|
||||||
MembershipUserCollection membersList = new MembershipUserCollection();
|
var membersList = new MembershipUserCollection();
|
||||||
Member[] memberArray = Member.GetMemberByName(usernameToMatch, false);
|
var memberArray = Member.GetMemberByName(usernameToMatch, false);
|
||||||
totalRecords = memberArray.Length;
|
totalRecords = memberArray.Length;
|
||||||
|
|
||||||
foreach (Member m in memberArray)
|
foreach (var m in memberArray)
|
||||||
{
|
{
|
||||||
if (counter >= startIndex)
|
if (counter >= startIndex)
|
||||||
membersList.Add(ConvertToMembershipUser(m));
|
membersList.Add(ConvertToMembershipUser(m));
|
||||||
@@ -367,14 +384,14 @@ namespace umbraco.providers.members
|
|||||||
/// </returns>
|
/// </returns>
|
||||||
public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
|
public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
|
||||||
{
|
{
|
||||||
int counter = 0;
|
var counter = 0;
|
||||||
int startIndex = pageSize * pageIndex;
|
var startIndex = pageSize * pageIndex;
|
||||||
int endIndex = startIndex + pageSize - 1;
|
var endIndex = startIndex + pageSize - 1;
|
||||||
MembershipUserCollection membersList = new MembershipUserCollection();
|
var membersList = new MembershipUserCollection();
|
||||||
Member[] memberArray = Member.GetAll;
|
var memberArray = Member.GetAll;
|
||||||
totalRecords = memberArray.Length;
|
totalRecords = memberArray.Length;
|
||||||
|
|
||||||
foreach (Member m in memberArray)
|
foreach (var m in memberArray)
|
||||||
{
|
{
|
||||||
if (counter >= startIndex)
|
if (counter >= startIndex)
|
||||||
membersList.Add(ConvertToMembershipUser(m));
|
membersList.Add(ConvertToMembershipUser(m));
|
||||||
@@ -406,24 +423,24 @@ namespace umbraco.providers.members
|
|||||||
/// </returns>
|
/// </returns>
|
||||||
public override string GetPassword(string username, string answer)
|
public override string GetPassword(string username, string answer)
|
||||||
{
|
{
|
||||||
if (!EnablePasswordRetrieval)
|
if (EnablePasswordRetrieval == false)
|
||||||
throw new ProviderException("Password Retrieval Not Enabled.");
|
throw new ProviderException("Password Retrieval Not Enabled.");
|
||||||
|
|
||||||
if (PasswordFormat == MembershipPasswordFormat.Hashed)
|
if (PasswordFormat == MembershipPasswordFormat.Hashed)
|
||||||
throw new ProviderException("Cannot retrieve Hashed passwords.");
|
throw new ProviderException("Cannot retrieve Hashed passwords.");
|
||||||
|
|
||||||
Member m = Member.GetMemberFromLoginName(username);
|
var m = Member.GetMemberFromLoginName(username);
|
||||||
if (m != null)
|
if (m != null)
|
||||||
{
|
{
|
||||||
if (RequiresQuestionAndAnswer)
|
if (RequiresQuestionAndAnswer)
|
||||||
{
|
{
|
||||||
// check if password answer property alias is set
|
// check if password answer property alias is set
|
||||||
if (!String.IsNullOrEmpty(_passwordRetrievalAnswerPropertyTypeAlias))
|
if (string.IsNullOrEmpty(_passwordRetrievalAnswerPropertyTypeAlias) == false)
|
||||||
{
|
{
|
||||||
// check if user is locked out
|
// check if user is locked out
|
||||||
if (!String.IsNullOrEmpty(_lockPropertyTypeAlias))
|
if (string.IsNullOrEmpty(_lockPropertyTypeAlias) == false)
|
||||||
{
|
{
|
||||||
bool isLockedOut = false;
|
var isLockedOut = false;
|
||||||
bool.TryParse(GetMemberProperty(m, _lockPropertyTypeAlias, true), out isLockedOut);
|
bool.TryParse(GetMemberProperty(m, _lockPropertyTypeAlias, true), out isLockedOut);
|
||||||
if (isLockedOut)
|
if (isLockedOut)
|
||||||
{
|
{
|
||||||
@@ -447,10 +464,7 @@ namespace umbraco.providers.members
|
|||||||
{
|
{
|
||||||
throw new MembershipPasswordException("The supplied user is not found");
|
throw new MembershipPasswordException("The supplied user is not found");
|
||||||
}
|
}
|
||||||
else
|
return m.GetPassword();
|
||||||
{
|
|
||||||
return m.Password;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -568,7 +582,12 @@ namespace umbraco.providers.members
|
|||||||
var encodedPassword = EncryptOrHashNewPassword(newPassword, out salt);
|
var encodedPassword = EncryptOrHashNewPassword(newPassword, out salt);
|
||||||
//set the password on the member
|
//set the password on the member
|
||||||
m.ChangePassword(
|
m.ChangePassword(
|
||||||
FormatPasswordForStorage(encodedPassword, salt));
|
FormatPasswordForStorage(encodedPassword, salt));
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(_lastPasswordChangedPropertyTypeAlias) == false)
|
||||||
|
{
|
||||||
|
UpdateMemberProperty(m, _lastPasswordChangedPropertyTypeAlias, DateTime.Now);
|
||||||
|
}
|
||||||
|
|
||||||
return newPassword;
|
return newPassword;
|
||||||
}
|
}
|
||||||
@@ -587,7 +606,7 @@ namespace umbraco.providers.members
|
|||||||
var m = Member.GetMemberFromLoginName(userName);
|
var m = Member.GetMemberFromLoginName(userName);
|
||||||
if (m != null)
|
if (m != null)
|
||||||
{
|
{
|
||||||
UpdateMemberProperty(m, _lockPropertyTypeAlias, false);
|
UpdateMemberProperty(m, _lockPropertyTypeAlias, 0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
throw new Exception(String.Format("No member with the username '{0}' found", userName));
|
throw new Exception(String.Format("No member with the username '{0}' found", userName));
|
||||||
@@ -597,8 +616,6 @@ namespace umbraco.providers.members
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Updates e-mail and potentially approved status, lock status and comment on a user.
|
/// Updates e-mail and potentially approved status, lock status and comment on a user.
|
||||||
/// Note: To automatically support lock, approve and comments you'll need to add references to the membertype properties in the
|
|
||||||
/// 'Member' element in web.config by adding their aliases to the 'umbracoApprovePropertyTypeAlias', 'umbracoLockPropertyTypeAlias' and 'umbracoCommentPropertyTypeAlias' attributes
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="user">A <see cref="T:System.Web.Security.MembershipUser"></see> object that represents the user to update and the updated information for the user.</param>
|
/// <param name="user">A <see cref="T:System.Web.Security.MembershipUser"></see> object that represents the user to update and the updated information for the user.</param>
|
||||||
public override void UpdateUser(MembershipUser user)
|
public override void UpdateUser(MembershipUser user)
|
||||||
@@ -607,10 +624,14 @@ namespace umbraco.providers.members
|
|||||||
m.Email = user.Email;
|
m.Email = user.Email;
|
||||||
|
|
||||||
// if supported, update approve status
|
// if supported, update approve status
|
||||||
UpdateMemberProperty(m, _approvedPropertyTypeAlias, user.IsApproved);
|
UpdateMemberProperty(m, _approvedPropertyTypeAlias, user.IsApproved ? 1 : 0);
|
||||||
|
|
||||||
// if supported, update lock status
|
// if supported, update lock status
|
||||||
UpdateMemberProperty(m, _lockPropertyTypeAlias, user.IsLockedOut);
|
UpdateMemberProperty(m, _lockPropertyTypeAlias, user.IsLockedOut ? 1 : 0);
|
||||||
|
if (user.IsLockedOut)
|
||||||
|
{
|
||||||
|
UpdateMemberProperty(m, _lastLockedOutPropertyTypeAlias, DateTime.Now);
|
||||||
|
}
|
||||||
|
|
||||||
// if supported, update comment
|
// if supported, update comment
|
||||||
UpdateMemberProperty(m, _commentPropertyTypeAlias, user.Comment);
|
UpdateMemberProperty(m, _commentPropertyTypeAlias, user.Comment);
|
||||||
@@ -624,8 +645,7 @@ namespace umbraco.providers.members
|
|||||||
{
|
{
|
||||||
if (m.getProperty(propertyAlias) != null)
|
if (m.getProperty(propertyAlias) != null)
|
||||||
{
|
{
|
||||||
m.getProperty(propertyAlias).Value =
|
m.getProperty(propertyAlias).Value = propertyValue;
|
||||||
propertyValue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -734,7 +754,8 @@ namespace umbraco.providers.members
|
|||||||
// lock user?
|
// lock user?
|
||||||
if (failedAttempts >= MaxInvalidPasswordAttempts)
|
if (failedAttempts >= MaxInvalidPasswordAttempts)
|
||||||
{
|
{
|
||||||
UpdateMemberProperty(updateMemberDataObject, _lockPropertyTypeAlias, true);
|
UpdateMemberProperty(updateMemberDataObject, _lockPropertyTypeAlias, 1);
|
||||||
|
UpdateMemberProperty(updateMemberDataObject, _lastLockedOutPropertyTypeAlias, DateTime.Now);
|
||||||
}
|
}
|
||||||
updateMemberDataObject.Save();
|
updateMemberDataObject.Save();
|
||||||
}
|
}
|
||||||
@@ -824,7 +845,8 @@ namespace umbraco.providers.members
|
|||||||
{
|
{
|
||||||
if (m == null) return null;
|
if (m == null) return null;
|
||||||
|
|
||||||
var lastLogin = DateTime.Now;
|
var lastLogin = DateTime.Now;
|
||||||
|
var lastLocked = DateTime.MinValue;
|
||||||
var isApproved = true;
|
var isApproved = true;
|
||||||
var isLocked = false;
|
var isLocked = false;
|
||||||
var comment = "";
|
var comment = "";
|
||||||
@@ -844,6 +866,11 @@ namespace umbraco.providers.members
|
|||||||
if (string.IsNullOrEmpty(_lockPropertyTypeAlias) == false)
|
if (string.IsNullOrEmpty(_lockPropertyTypeAlias) == false)
|
||||||
{
|
{
|
||||||
bool.TryParse(GetMemberProperty(m, _lockPropertyTypeAlias, true), out isLocked);
|
bool.TryParse(GetMemberProperty(m, _lockPropertyTypeAlias, true), out isLocked);
|
||||||
|
}
|
||||||
|
// last locked
|
||||||
|
if (string.IsNullOrEmpty(_lastLockedOutPropertyTypeAlias) == false)
|
||||||
|
{
|
||||||
|
DateTime.TryParse(GetMemberProperty(m, _lastLockedOutPropertyTypeAlias, false), out lastLocked);
|
||||||
}
|
}
|
||||||
// comment
|
// comment
|
||||||
if (string.IsNullOrEmpty(_commentPropertyTypeAlias) == false)
|
if (string.IsNullOrEmpty(_commentPropertyTypeAlias) == false)
|
||||||
@@ -856,8 +883,8 @@ namespace umbraco.providers.members
|
|||||||
passwordQuestion = GetMemberProperty(m, _passwordRetrievalQuestionPropertyTypeAlias, false);
|
passwordQuestion = GetMemberProperty(m, _passwordRetrievalQuestionPropertyTypeAlias, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new MembershipUser(_providerName, m.LoginName, m.Id, m.Email, passwordQuestion, comment, isApproved, isLocked, m.CreateDateTime, lastLogin,
|
return new MembershipUser(_providerName, m.LoginName, m.Id, m.Email, passwordQuestion, comment, isApproved, isLocked, m.CreateDateTime, lastLogin,
|
||||||
DateTime.Now, DateTime.Now, DateTime.Now);
|
DateTime.Now, DateTime.Now, lastLocked);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -869,7 +896,8 @@ namespace umbraco.providers.members
|
|||||||
{
|
{
|
||||||
if (m == null) return null;
|
if (m == null) return null;
|
||||||
|
|
||||||
var lastLogin = DateTime.Now;
|
var lastLogin = DateTime.Now;
|
||||||
|
var lastLocked = DateTime.MinValue;
|
||||||
var isApproved = true;
|
var isApproved = true;
|
||||||
var isLocked = false;
|
var isLocked = false;
|
||||||
var comment = "";
|
var comment = "";
|
||||||
@@ -889,6 +917,11 @@ namespace umbraco.providers.members
|
|||||||
if (string.IsNullOrEmpty(_lockPropertyTypeAlias) == false)
|
if (string.IsNullOrEmpty(_lockPropertyTypeAlias) == false)
|
||||||
{
|
{
|
||||||
bool.TryParse(GetMemberProperty(m, _lockPropertyTypeAlias, true), out isLocked);
|
bool.TryParse(GetMemberProperty(m, _lockPropertyTypeAlias, true), out isLocked);
|
||||||
|
}
|
||||||
|
// last locked
|
||||||
|
if (string.IsNullOrEmpty(_lastLockedOutPropertyTypeAlias) == false)
|
||||||
|
{
|
||||||
|
DateTime.TryParse(GetMemberProperty(m, _lastLockedOutPropertyTypeAlias, false), out lastLocked);
|
||||||
}
|
}
|
||||||
// comment
|
// comment
|
||||||
if (string.IsNullOrEmpty(_commentPropertyTypeAlias) == false)
|
if (string.IsNullOrEmpty(_commentPropertyTypeAlias) == false)
|
||||||
@@ -901,8 +934,8 @@ namespace umbraco.providers.members
|
|||||||
passwordQuestion = GetMemberProperty(m, _passwordRetrievalQuestionPropertyTypeAlias, false);
|
passwordQuestion = GetMemberProperty(m, _passwordRetrievalQuestionPropertyTypeAlias, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new MembershipUser(_providerName, m.Username, m.Id, m.Email, passwordQuestion, comment, isApproved, isLocked, m.CreateDate, lastLogin,
|
return new MembershipUser(_providerName, m.Username, m.Id, m.Email, passwordQuestion, comment, isApproved, isLocked, m.CreateDate, lastLogin,
|
||||||
DateTime.Now, DateTime.Now, DateTime.Now);
|
DateTime.Now, DateTime.Now, lastLocked);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
Reference in New Issue
Block a user