Troubleshooting APS.NET membership provider. A easy way of troubleshoot any provider based configuration is to replace the configuration for the original provider with a logging one that has the original provider to do all functionality.
Logging membership provider
Web.config
Here we using our LoggingMembershipProvider to log all access to the base page provider (EPiServerCommonMembershipProvider)
<membership
defaultProvider="LoggingMembershipProvider"
userIsOnlineTimeWindow="10">
<providers>
<clear />
<add name="LoggingMembershipProvider"
provider="EPiServerCommonMembershipProvider"
type="Dev.Web.LoggingMembershipProvider"/>
...
EPiServerLog.config
The logging membership provider logs to log4net, and here is the configuration for an EPiServer site.
<log4net>
...
<logger name="Dev.Web.LoggingMembershipProvider">
<level value="All" />
</logger>
Source code
using System;
using System.Web.Security;
using System.Collections.Specialized;
using log4net;
namespace Dev.Web
{
public class LoggingMembershipProvider : MembershipProvider
{
private static readonly ILog _log =
LogManager.GetLogger(typeof(LoggingMembershipProvider));
private string _providername;
public override void Initialize(string name, NameValueCollection config)
{
if (config == null)
{
throw new ArgumentNullException("config");
}
if ((name
null) || (name.Trim().Length
0))
{
name = "LoggingMembershipProvider";
}
if (string.IsNullOrEmpty(config["description"]))
{
config.Remove("description");
config.Add("description", "Logging Membership provider");
}
_providername = config["provider"];
_log.Debug("Initialize for provider " + _providername);
base.Initialize(name, config);
}
private MembershipProvider _provider;
private object _providerLock = new object();
private MembershipProvider Provider
{
get
{
if (_provider == null)
{
lock (_providerLock)
{
if (_provider == null)
{
_provider = Membership.Providers[_providername];
}
}
}
return _provider;
}
}
public override string ApplicationName
{
get
{
var ret = Provider.ApplicationName;
_log.Debug("Getting ApplicationName = " + ret);
return ret;
}
set
{
_log.Debug("Setting ApplicationName = " + value);
Provider.ApplicationName = value;
}
}
public override bool ChangePassword(
string username,
string oldPassword,
string newPassword)
{
var ret = Provider.ChangePassword(username, oldPassword, newPassword);
_log.DebugFormat("ChangePassword({1}, {2},{3}) := {0}",
ret,
username,
oldPassword,
newPassword);
return ret;
}
public override bool ChangePasswordQuestionAndAnswer(
string username,
string password,
string newPasswordQuestion,
string newPasswordAnswer)
{
var ret = Provider.ChangePasswordQuestionAndAnswer(
username, password, newPasswordQuestion, newPasswordAnswer);
_log.DebugFormat("ChangePasswordQuestionAndAnswer({1}, {2}) := {0}",
ret, username, password);
return ret;
}
public override MembershipUser CreateUser(
string username,
string password,
string email,
string passwordQuestion,
string passwordAnswer,
bool isApproved,
object providerUserKey,
out MembershipCreateStatus status)
{
var ret = Provider.CreateUser(
username, passwordAnswer, email, passwordQuestion,
passwordAnswer, isApproved,
providerUserKey, out status);
_log.DebugFormat("CreateUser({1}, {2}) := {0}", ret, username, password);
return ret;
}
public override bool DeleteUser(string username, bool deleteAllRelatedData)
{
var ret = Provider.DeleteUser(username, deleteAllRelatedData);
_log.DebugFormat("DeleteUser({1}, {2}) := {0}",
ret, username, deleteAllRelatedData);
return ret;
}
public override bool EnablePasswordReset
{
get
{
var ret = Provider.EnablePasswordReset;
_log.DebugFormat("EnablePasswordReset := {0}", ret);
return true;
}
}
public override bool EnablePasswordRetrieval
{
get
{
var ret = Provider.EnablePasswordRetrieval;
_log.DebugFormat("EnablePasswordRetrieval := {0}", ret);
return ret;
}
}
public override MembershipUserCollection FindUsersByEmail(
string emailToMatch,
int pageIndex,
int pageSize,
out int totalRecords)
{
var ret = Provider.FindUsersByEmail(emailToMatch, pageIndex,
pageSize, out totalRecords);
_log.DebugFormat("FindUsersByEmail({1}, {2}, {3}, out {4}) := {0}",
ret, emailToMatch, pageIndex, pageSize, totalRecords);
return ret;
}
public override MembershipUserCollection FindUsersByName(
string usernameToMatch,
int pageIndex,
int pageSize,
out int totalRecords)
{
var ret = Provider.FindUsersByName(
usernameToMatch, pageIndex, pageSize, out totalRecords);
_log.DebugFormat("FindUsersByName({1}, {2}, out {3}) := {0}",
ret, pageIndex, pageSize, totalRecords);
return ret;
}
public override MembershipUserCollection GetAllUsers(
int pageIndex,
int pageSize,
out int totalRecords)
{
var ret = Provider.GetAllUsers(pageIndex, pageSize, out totalRecords);
_log.DebugFormat("GetAllUsers({1}, {2}, out {3}) := {0}",
ret, pageIndex, pageSize, totalRecords);
return ret;
}
public override int GetNumberOfUsersOnline()
{
var ret = Provider.GetNumberOfUsersOnline();
_log.DebugFormat("GetNumberOfUsersOnline() := {0}", ret);
return ret;
}
public override string GetPassword(string username, string answer)
{
var ret = Provider.GetPassword(username, answer);
_log.DebugFormat("GetPassword({1}, {2}) := {0}", ret, username, answer);
return ret;
}
public override MembershipUser GetUser(string username, bool userIsOnline)
{
var ret = Provider.GetUser(username, userIsOnline);
_log.DebugFormat("GetUser({1}, {2}) := {0}", ret, username, userIsOnline);
return ret;
}
public override MembershipUser GetUser(
object providerUserKey,
bool userIsOnline)
{
var ret = Provider.GetUser(providerUserKey, userIsOnline);
_log.DebugFormat("GetUser({1}, {2}) := {0}",
ret, providerUserKey, userIsOnline);
return ret;
}
public override string GetUserNameByEmail(string email)
{
var ret = Provider.GetUserNameByEmail(email);
_log.DebugFormat("GetUserNameByEmail({1}) := {0}", ret, email);
return ret;
}
public override int MaxInvalidPasswordAttempts
{
get
{
var ret = Provider.MaxInvalidPasswordAttempts;
_log.DebugFormat("MaxInvalidPasswordAttempts := {0}", ret);
return ret;
}
}
public override int MinRequiredNonAlphanumericCharacters
{
get
{
var ret = Provider.MinRequiredNonAlphanumericCharacters;
_log.DebugFormat("MinRequiredNonAlphanumericCharacters := {0}", ret);
return ret;
}
}
public override int MinRequiredPasswordLength
{
get
{
var ret = Provider.MinRequiredPasswordLength;
_log.DebugFormat("MinRequiredPasswordLength := {0}", ret);
return ret;
}
}
public override int PasswordAttemptWindow
{
get
{
var ret = Provider.PasswordAttemptWindow;
_log.DebugFormat("PasswordAttemptWindow := {0}", ret);
return ret;
}
}
public override MembershipPasswordFormat PasswordFormat
{
get
{
var ret = Provider.PasswordFormat;
_log.DebugFormat("PasswordFormat := {0}", ret);
return ret;
}
}
public override string PasswordStrengthRegularExpression
{
get
{
var ret = Provider.PasswordStrengthRegularExpression;
_log.DebugFormat("PasswordStrengthRegularExpression := {0}", ret);
return ret;
}
}
public override bool RequiresQuestionAndAnswer
{
get
{
var ret = Provider.RequiresQuestionAndAnswer;
_log.DebugFormat("RequiresQuestionAndAnswer := {0}", ret);
return ret;
}
}
public override bool RequiresUniqueEmail
{
get
{
var ret = Provider.RequiresUniqueEmail;
_log.DebugFormat("RequiresUniqueEmail := {0}", ret);
return ret;
}
}
public override string ResetPassword(string username, string answer)
{
var ret = Provider.ResetPassword(username, answer);
_log.DebugFormat("ResetPassword({1}, {2}) := {0}", ret, username, answer);
return ret;
}
public override bool UnlockUser(string userName)
{
var ret = Provider.UnlockUser(userName);
_log.DebugFormat("UnlockUser({1}) := {0}", ret, userName);
return ret;
}
public override void UpdateUser(MembershipUser user)
{
_log.DebugFormat("UpdateUser({1})", user);
Provider.UpdateUser(user);
}
public override bool ValidateUser(string username, string password)
{
var ret = Provider.ValidateUser(username, password);
_log.DebugFormat("ValidateUser({1}, {2}) := {0}", ret, username, password);
return ret;
}
}
}