Refactoring MemberService and MembersMembershipProvider from Darrens pull request to fit the changes made the past week.

SecurityHelper is moved to the Umbraco.Web.Security namespace.
MembershipExtensions are changed to the new models
This commit is contained in:
Morten Christensen
2013-09-04 15:42:01 +02:00
parent 8ffbad4b49
commit 1f68cad45b
9 changed files with 181 additions and 88 deletions

View File

@@ -0,0 +1,25 @@
using System;
using System.Web.Security;
namespace Umbraco.Core.Models.Membership
{
internal static class MembershipExtensions
{
internal static MembershipUser AsConcreteMembershipUser(this IMember member)
{
var membershipMember = new UmbracoMembershipMember(member);
return membershipMember;
}
internal static IMember AsIMember(this MembershipUser membershipMember)
{
var member = membershipMember as UmbracoMembershipMember;
if (member != null)
{
return member.Member;
}
throw new NotImplementedException();
}
}
}

View File

@@ -11,6 +11,11 @@ namespace Umbraco.Core.Models.Membership
_member = member;
}
internal IMember Member
{
get { return _member; }
}
public override string Email
{
get { return _member.Email; }

View File

@@ -1,4 +1,4 @@
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Models;
namespace Umbraco.Core.Services
{
@@ -18,16 +18,16 @@ namespace Umbraco.Core.Services
/// </remarks>
internal interface IMembershipMemberService : IService
{
IMembershipUser CreateMember(string username, string email, string password, string memberType, int userId = 0);
IMembershipUser GetByUsername(string login);
IMember CreateMember(string username, string email, string password, string memberTypeAlias, int userId = 0);
IMembershipUser GetByEmail(string email);
IMember GetByUsername(string login);
IMembershipUser GetById(object id);
IMember GetByEmail(string email);
void Delete(IMembershipUser membershipUser);
IMember GetById(object id);
void Save(IMembershipUser membershipUser);
void Delete(IMember membershipUser);
void Save(IMember membershipUser);
}
}

View File

@@ -1,4 +1,5 @@
using Umbraco.Core.Models.Membership;
using System;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.Querying;
using Umbraco.Core.Persistence.UnitOfWork;
@@ -30,11 +31,21 @@ namespace Umbraco.Core.Services
_uowProvider = provider;
}
public IMembershipUser CreateMember(string username, string email, string password, string memberType, int userId = 0)
public IMember CreateMember(string username, string email, string password, string memberTypeAlias, int userId = 0)
{
var uow = _uowProvider.GetUnitOfWork();
IMemberType memberType;
var member = new Member();
using (var repository = _repositoryFactory.CreateMemberTypeRepository(uow))
{
var query = Query<IMemberType>.Builder.Where(x => x.Alias == memberTypeAlias);
memberType = repository.GetByQuery(query).FirstOrDefault();
}
if (memberType == null)
throw new Exception(string.Format("No MemberType matching the passed in Alias: '{0}' was found", memberTypeAlias));
var member = new Member(email, -1, memberType, new PropertyCollection());
using (var repository = _repositoryFactory.CreateMemberRepository(uow))
{
@@ -49,50 +60,68 @@ namespace Umbraco.Core.Services
return member;
}
public IMembershipUser GetByUsername(string userName)
public IMember GetByUsername(string userName)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
{
var query = Query<IMembershipUser>.Builder.Where(x => x.Username == userName);
var membershipUser = repository.GetByQuery(query).FirstOrDefault();
var query = Query<IMember>.Builder.Where(x => x.Username == userName);
var member = repository.GetByQuery(query).FirstOrDefault();
return membershipUser;
return member;
}
}
public IMembershipUser GetByEmail(string email)
public IMember GetByEmail(string email)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
{
var query = Query<IMembershipUser>.Builder.Where(x => x.Email == email);
var membershipUser = repository.GetByQuery(query).FirstOrDefault();
var query = Query<IMember>.Builder.Where(x => x.Email == email);
var member = repository.GetByQuery(query).FirstOrDefault();
return membershipUser;
return member;
}
}
public IMembershipUser GetById(object id)
public IMember GetById(object id)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
{
var query = Query<IMembershipUser>.Builder.Where(x => x.Id == id);
var membershipUser = repository.GetByQuery(query).FirstOrDefault();
if (id is int)
{
var query = Query<IMember>.Builder.Where(x => x.Id == (int)id);
var member = repository.GetByQuery(query).FirstOrDefault();
return member;
}
return membershipUser;
if (id is Guid)
{
var query = Query<IMember>.Builder.Where(x => x.Key == (Guid)id);
var member = repository.GetByQuery(query).FirstOrDefault();
return member;
}
return null;
}
}
public void Delete(IMembershipUser membershipUser)
public void Delete(IMember member)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateMemberRepository(uow))
{
repository.Delete(membershipUser);
repository.Delete(member);
uow.Commit();
}
}
public void Save(IMembershipUser membershipUser)
public void Save(IMember member)
{
throw new System.NotImplementedException();
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateMemberRepository(uow))
{
repository.AddOrUpdate(member);
uow.Commit();
}
}
}
}

View File

@@ -203,6 +203,7 @@
<Compile Include="Models\IMember.cs" />
<Compile Include="Models\IMemberType.cs" />
<Compile Include="Models\Member.cs" />
<Compile Include="Models\Membership\MembershipExtensions.cs" />
<Compile Include="Models\Membership\UmbracoMembershipMember.cs" />
<Compile Include="Models\Membership\UmbracoMembershipUser.cs" />
<Compile Include="Models\MemberType.cs" />

View File

@@ -4,67 +4,20 @@ using System.Configuration.Provider;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.Hosting;
using System.Web.Security;
using Umbraco.Core;
using Umbraco.Core.Logging;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Services;
using Umbraco.Web.Helpers;
using Umbraco.Core.Models.Membership;
namespace Umbraco.Web.Security.Providers
{
/// <summary>
/// Extension methods
/// </summary>
static internal class Extensions
{
public static MembershipUser AsConcreteMembershipUser(this IMembershipUser member)
{
// TODO: Provider name?? first constructor arg... Replace DateTime.Now;
var m = new MembershipUser("",
member.Username,
member.ProviderUserKey,
member.Email,
member.PasswordQuestion,
member.Comments,
member.IsApproved,
member.IsLockedOut,
member.CreateDate,
member.LastLoginDate,
member.UpdateDate,
member.LastPasswordChangeDate,
member.LastLockoutDate);
return m;
}
public static IMembershipUser AsIMembershipUser(this MembershipUser membershipUser)
{
var m = new Member
{
Username = membershipUser.UserName,
Password = membershipUser.GetPassword(),
Email = membershipUser.Email,
CreateDate = membershipUser.CreationDate,
Comments = membershipUser.Comment,
IsApproved = membershipUser.IsApproved,
IsLockedOut = membershipUser.IsLockedOut,
LastLockoutDate = membershipUser.LastLockoutDate,
LastLoginDate = membershipUser.LastLoginDate,
LastPasswordChangeDate = membershipUser.LastPasswordChangedDate
};
return m;
}
}
/// <summary>
/// Custom Membership Provider for Umbraco Members (User authentication for Frontend applications NOT umbraco CMS)
/// </summary>
internal class MembersMembershipProvider : MembershipProvider
{
#region Fields
private string _applicationName;
private bool _enablePasswordReset;
@@ -76,9 +29,9 @@ namespace Umbraco.Web.Security.Providers
private MembershipPasswordFormat _passwordFormat;
private string _passwordStrengthRegularExpression;
private bool _requiresQuestionAndAnswer;
private bool _requiresUniqueEmail;
private string _passwordStrengthRegularExpression;
private bool _requiresQuestionAndAnswer;
private bool _requiresUniqueEmail;
#endregion
@@ -534,7 +487,7 @@ namespace Umbraco.Web.Security.Providers
/// <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)
{
var member = user.AsIMembershipUser();
var member = user.AsIMember();
MemberService.Save(member);
}
@@ -742,6 +695,8 @@ namespace Umbraco.Web.Security.Providers
throw new System.NotImplementedException();
}
#region Private methods
private bool IsPasswordValid(string password)
{
if (_minRequiredNonAlphanumericCharacters > 0)
@@ -796,6 +751,87 @@ namespace Umbraco.Web.Security.Providers
throw new ProviderException("Unsupported password format.");
}
return encodedPassword;
}
}
/// <summary>
/// Gets the boolean value.
/// </summary>
/// <param name="config">The config.</param>
/// <param name="valueName">Name of the value.</param>
/// <param name="defaultValue">if set to <c>true</c> [default value].</param>
/// <returns></returns>
private bool GetBooleanValue(NameValueCollection config, string valueName, bool defaultValue)
{
bool flag;
var str = config[valueName];
if (str == null)
return defaultValue;
if (bool.TryParse(str, out flag) == false)
{
throw new ProviderException("Value must be boolean.");
}
return flag;
}
/// <summary>
/// Gets the int value.
/// </summary>
/// <param name="config">The config.</param>
/// <param name="valueName">Name of the value.</param>
/// <param name="defaultValue">The default value.</param>
/// <param name="zeroAllowed">if set to <c>true</c> [zero allowed].</param>
/// <param name="maxValueAllowed">The max value allowed.</param>
/// <returns></returns>
private int GetIntValue(NameValueCollection config, string valueName, int defaultValue, bool zeroAllowed, int maxValueAllowed)
{
int num;
var s = config[valueName];
if (s == null)
{
return defaultValue;
}
if (int.TryParse(s, out num) == false)
{
if (zeroAllowed)
{
throw new ProviderException("Value must be non negative integer");
}
throw new ProviderException("Value must be positive integer");
}
if (zeroAllowed && (num < 0))
{
throw new ProviderException("Value must be non negativeinteger");
}
if (zeroAllowed == false && (num <= 0))
{
throw new ProviderException("Value must be positive integer");
}
if ((maxValueAllowed > 0) && (num > maxValueAllowed))
{
throw new ProviderException("Value too big");
}
return num;
}
/// <summary>
/// Gets the name of the default app.
/// </summary>
/// <returns></returns>
private string GetDefaultAppName()
{
try
{
var applicationVirtualPath = HostingEnvironment.ApplicationVirtualPath;
return string.IsNullOrEmpty(applicationVirtualPath) ? "/" : applicationVirtualPath;
}
catch
{
return "/";
}
}
#endregion
}
}

View File

@@ -2,7 +2,7 @@
using System.Configuration.Provider;
using System.Web.Hosting;
namespace Umbraco.Web.Helpers
namespace Umbraco.Web.Security
{
internal class SecurityHelper
{

View File

@@ -294,7 +294,7 @@
<Compile Include="Controllers\ProfileController.cs" />
<Compile Include="Controllers\LoginStatusController.cs" />
<Compile Include="Editors\MediaController.cs" />
<Compile Include="Helpers\SecurityHelper.cs" />
<Compile Include="Security\SecurityHelper.cs" />
<Compile Include="Models\ContentEditing\ContentSortOrder.cs" />
<Compile Include="Controllers\RegisterController.cs" />
<Compile Include="Models\ProfileModel.cs" />

View File

@@ -1,11 +1,8 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Specialized;
using System.Collections;
using System.Globalization;
using System.Web.Hosting;
using System.Diagnostics;
using System.Configuration.Provider;
namespace umbraco.providers
@@ -13,7 +10,7 @@ namespace umbraco.providers
/// <summary>
/// Security Helper Methods
/// </summary>
[ObsoleteAttribute("This clas is obsolete. Use Umbraco.Web.Security.Helper.SecurityHelper instead.", false)]
[ObsoleteAttribute("This clas is obsolete and wil be removed along with the legacy Membership Provider.", false)]
internal class SecUtility
{
/// <summary>