Guest User

Untitled

a guest
Nov 24th, 2018
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 89.15 KB | None | 0 0
  1. //------------------------------------------------------------------------------
  2. // <copyright file="SqlMembershipProvider.cs" company="Microsoft">
  3. //     Copyright (c) Microsoft Corporation.  All rights reserved.
  4. // </copyright>
  5. //------------------------------------------------------------------------------
  6.  
  7. namespace Microsoft.Samples {
  8.     using System;
  9.     using System.Web.Security;
  10.     using System.Web;
  11.     using System.Web.Configuration;
  12.     using System.Security.Principal;
  13.     using System.Security.Permissions;
  14.     using System.Globalization;
  15.     using System.Runtime.Serialization;
  16.     using System.Collections;
  17.     using System.Collections.Specialized;
  18.     using System.Data;
  19.     using System.Data.SqlClient;
  20.     using System.Data.SqlTypes;
  21.     using System.Security.Cryptography;
  22.     using System.Text;
  23.     using System.Text.RegularExpressions;
  24.     using System.Configuration.Provider;
  25.     using System.Configuration;
  26.     using System.Web.DataAccess;
  27.     using System.Web.Management;
  28.     using System.Web.Util;
  29.  
  30.     /// <devdoc>
  31.     ///    <para>[To be supplied.]</para>
  32.     /// </devdoc>
  33.     // Remove CAS from sample: [AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)]
  34.     // Remove CAS from sample: [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)]
  35.     public class SqlMembershipProvider : MembershipProvider
  36.     {
  37.         ////////////////////////////////////////////////////////////
  38.         // Public properties
  39.  
  40.         public override bool    EnablePasswordRetrieval   { get { return _EnablePasswordRetrieval; } }
  41.  
  42.         public override bool    EnablePasswordReset       { get { return _EnablePasswordReset; } }
  43.  
  44.         public override bool    RequiresQuestionAndAnswer   { get { return _RequiresQuestionAndAnswer; } }
  45.  
  46.         public override bool    RequiresUniqueEmail         { get { return _RequiresUniqueEmail; } }
  47.  
  48.         public override MembershipPasswordFormat PasswordFormat { get { return _PasswordFormat; }}
  49.         public override int MaxInvalidPasswordAttempts { get { return _MaxInvalidPasswordAttempts; } }
  50.  
  51.         public override int PasswordAttemptWindow { get { return _PasswordAttemptWindow; } }
  52.  
  53.         public override int MinRequiredPasswordLength
  54.         {
  55.             get { return _MinRequiredPasswordLength; }
  56.         }
  57.  
  58.         public override int MinRequiredNonAlphanumericCharacters
  59.         {
  60.             get { return _MinRequiredNonalphanumericCharacters; }
  61.         }
  62.  
  63.         public override string PasswordStrengthRegularExpression
  64.         {
  65.             get { return _PasswordStrengthRegularExpression; }
  66.         }
  67.  
  68.         public override string ApplicationName
  69.         {
  70.             get { return _AppName; }
  71.             set
  72.             {
  73.                 if (String.IsNullOrEmpty(value))
  74.                     throw new ArgumentNullException("value");
  75.  
  76.                 if (value.Length > 256)
  77.                     throw new ProviderException( SR.GetString( SR.Provider_application_name_too_long ) );
  78.                 _AppName = value;
  79.             }
  80.         }
  81.  
  82.         private string    _sqlConnectionString;
  83.         private bool      _EnablePasswordRetrieval;
  84.         private bool      _EnablePasswordReset;
  85.         private bool      _RequiresQuestionAndAnswer;
  86.         private string    _AppName;
  87.         private bool      _RequiresUniqueEmail;
  88.         private int       _MaxInvalidPasswordAttempts;
  89.         private int       _CommandTimeout;
  90.         private int       _PasswordAttemptWindow;
  91.         private int       _MinRequiredPasswordLength;
  92.         private int       _MinRequiredNonalphanumericCharacters;
  93.         private string    _PasswordStrengthRegularExpression;
  94.         private int       _SchemaVersionCheck;
  95.         private MembershipPasswordFormat _PasswordFormat;
  96.  
  97.         private const int      PASSWORD_SIZE  = 14;
  98.  
  99.         //////////////////////////////////////////////////////////////////////
  100.         //////////////////////////////////////////////////////////////////////
  101.         //////////////////////////////////////////////////////////////////////
  102.  
  103.         public override void Initialize(string name, NameValueCollection config)
  104.         {
  105.             // Remove CAS from sample: HttpRuntime.CheckAspNetHostingPermission (AspNetHostingPermissionLevel.Low, SR.Feature_not_supported_at_this_level);
  106.             if (config == null)
  107.                 throw new ArgumentNullException("config");
  108.             if (String.IsNullOrEmpty(name))
  109.                 name = "SqlMembershipProvider";
  110.             if (string.IsNullOrEmpty(config["description"])) {
  111.                 config.Remove("description");
  112.                 config.Add("description", SR.GetString(SR.MembershipSqlProvider_description));
  113.             }
  114.             base.Initialize(name, config);
  115.  
  116.             _SchemaVersionCheck = 0;
  117.  
  118.             _EnablePasswordRetrieval    = SecUtility.GetBooleanValue(config, "enablePasswordRetrieval", false);
  119.             _EnablePasswordReset        = SecUtility.GetBooleanValue(config, "enablePasswordReset", true);
  120.             _RequiresQuestionAndAnswer  = SecUtility.GetBooleanValue(config, "requiresQuestionAndAnswer", true);
  121.             _RequiresUniqueEmail        = SecUtility.GetBooleanValue(config, "requiresUniqueEmail", true);
  122.             _MaxInvalidPasswordAttempts = SecUtility.GetIntValue( config, "maxInvalidPasswordAttempts", 5, false, 0 );
  123.             _PasswordAttemptWindow      = SecUtility.GetIntValue( config, "passwordAttemptWindow", 10, false, 0 );
  124.             _MinRequiredPasswordLength  = SecUtility.GetIntValue( config, "minRequiredPasswordLength", 7, false, 128 );
  125.             _MinRequiredNonalphanumericCharacters = SecUtility.GetIntValue( config, "minRequiredNonalphanumericCharacters", 1, true, 128 );
  126.  
  127.             _PasswordStrengthRegularExpression = config["passwordStrengthRegularExpression"];
  128.             if( _PasswordStrengthRegularExpression != null )
  129.             {
  130.                 _PasswordStrengthRegularExpression = _PasswordStrengthRegularExpression.Trim();
  131.                 if( _PasswordStrengthRegularExpression.Length != 0 )
  132.                 {
  133.                     try
  134.                     {
  135.                         Regex regex = new Regex( _PasswordStrengthRegularExpression );
  136.                     }
  137.                     catch( ArgumentException e )
  138.                     {
  139.                         throw new ProviderException( e.Message, e );
  140.                     }
  141.                 }
  142.             }
  143.             else
  144.             {
  145.                 _PasswordStrengthRegularExpression = string.Empty;
  146.             }
  147.             if (_MinRequiredNonalphanumericCharacters > _MinRequiredPasswordLength)
  148.                 throw new HttpException(SR.GetString(SR.MinRequiredNonalphanumericCharacters_can_not_be_more_than_MinRequiredPasswordLength));
  149.  
  150.             _CommandTimeout = SecUtility.GetIntValue( config, "commandTimeout", 30, true, 0 );
  151.             _AppName = config["applicationName"];
  152.             if (string.IsNullOrEmpty(_AppName))
  153.                 _AppName = SecUtility.GetDefaultAppName();
  154.  
  155.             if( _AppName.Length > 256 )
  156.             {
  157.                 throw new ProviderException(SR.GetString(SR.Provider_application_name_too_long));
  158.             }
  159.  
  160.             string strTemp = config["passwordFormat"];
  161.             if (strTemp == null)
  162.                 strTemp = "Hashed";
  163.  
  164.             switch(strTemp)
  165.             {
  166.             case "Clear":
  167.                 _PasswordFormat = MembershipPasswordFormat.Clear;
  168.                 break;
  169.             case "Encrypted":
  170.                 _PasswordFormat = MembershipPasswordFormat.Encrypted;
  171.                 break;
  172.             case "Hashed":
  173.                 _PasswordFormat = MembershipPasswordFormat.Hashed;
  174.                 break;
  175.             default:
  176.                 throw new ProviderException(SR.GetString(SR.Provider_bad_password_format));
  177.             }
  178.  
  179.             if (PasswordFormat == MembershipPasswordFormat.Hashed && EnablePasswordRetrieval)
  180.                 throw new ProviderException(SR.GetString(SR.Provider_can_not_retrieve_hashed_password));
  181.             //if (_PasswordFormat == MembershipPasswordFormat.Encrypted && MachineKeySection.IsDecryptionKeyAutogenerated)
  182.             //    throw new ProviderException(SR.GetString(SR.Can_not_use_encrypted_passwords_with_autogen_keys));
  183.  
  184.             string temp = config["connectionStringName"];
  185.             if (temp == null || temp.Length < 1)
  186.                 throw new ProviderException(SR.GetString(SR.Connection_name_not_specified));
  187.             _sqlConnectionString = SqlConnectionHelper.GetConnectionString(temp, true, true);
  188.             if (_sqlConnectionString == null || _sqlConnectionString.Length < 1) {
  189.                 throw new ProviderException(SR.GetString(SR.Connection_string_not_found, temp));
  190.             }
  191.  
  192.             config.Remove("connectionStringName");
  193.             config.Remove("enablePasswordRetrieval");
  194.             config.Remove("enablePasswordReset");
  195.             config.Remove("requiresQuestionAndAnswer");
  196.             config.Remove("applicationName");
  197.             config.Remove("requiresUniqueEmail");
  198.             config.Remove("maxInvalidPasswordAttempts");
  199.             config.Remove("passwordAttemptWindow");
  200.             config.Remove("commandTimeout");
  201.             config.Remove("passwordFormat");
  202.             config.Remove("name");
  203.             config.Remove("minRequiredPasswordLength");
  204.             config.Remove("minRequiredNonalphanumericCharacters");
  205.             config.Remove("passwordStrengthRegularExpression");
  206.             if (config.Count > 0) {
  207.                 string attribUnrecognized = config.GetKey(0);
  208.                 if (!String.IsNullOrEmpty(attribUnrecognized))
  209.                     throw new ProviderException(SR.GetString(SR.Provider_unrecognized_attribute, attribUnrecognized));
  210.             }
  211.         }
  212.  
  213.         private void CheckSchemaVersion( SqlConnection connection )
  214.         {
  215.             string[] features = { "Common", "Membership" };
  216.             string   version  = "1";
  217.  
  218.             SecUtility.CheckSchemaVersion( this,
  219.                                            connection,
  220.                                            features,
  221.                                            version,
  222.                                            ref _SchemaVersionCheck );
  223.         }
  224.  
  225.         private int CommandTimeout
  226.         {
  227.             get{ return _CommandTimeout; }
  228.         }
  229.  
  230.         ////////////////////////////////////////////////////////////
  231.         ////////////////////////////////////////////////////////////
  232.         ////////////////////////////////////////////////////////////
  233.  
  234.         public override MembershipUser CreateUser( string username,
  235.                                                    string password,
  236.                                                    string email,
  237.                                                    string passwordQuestion,
  238.                                                    string passwordAnswer,
  239.                                                    bool   isApproved,
  240.                                                    object providerUserKey,
  241.                                                    out    MembershipCreateStatus status )
  242.         {
  243.             if( !SecUtility.ValidateParameter(ref password, true, true, false, 128))
  244.             {
  245.                 status = MembershipCreateStatus.InvalidPassword;
  246.                 return null;
  247.             }
  248.  
  249.             string salt = GenerateSalt();
  250.             string pass = EncodePassword(password, (int)_PasswordFormat, salt);
  251.             if ( pass.Length > 128 )
  252.             {
  253.                 status = MembershipCreateStatus.InvalidPassword;
  254.                 return null;
  255.             }
  256.  
  257.             string encodedPasswordAnswer;
  258.             if( passwordAnswer != null )
  259.             {
  260.                 passwordAnswer = passwordAnswer.Trim();
  261.             }
  262.  
  263.             if (!string.IsNullOrEmpty(passwordAnswer)) {
  264.                 if( passwordAnswer.Length > 128 )
  265.                 {
  266.                     status = MembershipCreateStatus.InvalidAnswer;
  267.                     return null;
  268.                 }
  269.                 encodedPasswordAnswer = EncodePassword(passwordAnswer.ToLower(CultureInfo.InvariantCulture), (int)_PasswordFormat, salt);
  270.             }
  271.             else
  272.                 encodedPasswordAnswer = passwordAnswer;
  273.             if (!SecUtility.ValidateParameter(ref encodedPasswordAnswer, RequiresQuestionAndAnswer, true, false, 128))
  274.             {
  275.                 status = MembershipCreateStatus.InvalidAnswer;
  276.                 return null;
  277.             }
  278.  
  279.             if( !SecUtility.ValidateParameter( ref username,true, true, true, 256))
  280.             {
  281.                 status = MembershipCreateStatus.InvalidUserName;
  282.                 return null;
  283.             }
  284.  
  285.             if( !SecUtility.ValidateParameter( ref email,
  286.                                                RequiresUniqueEmail,
  287.                                                RequiresUniqueEmail,
  288.                                                false,
  289.                                                256 ) )
  290.             {
  291.                 status = MembershipCreateStatus.InvalidEmail;
  292.                 return null;
  293.             }
  294.  
  295.             if( !SecUtility.ValidateParameter( ref passwordQuestion, RequiresQuestionAndAnswer, true, false, 256))
  296.             {
  297.                 status = MembershipCreateStatus.InvalidQuestion;
  298.                 return null;
  299.             }
  300.  
  301.             if( providerUserKey != null )
  302.             {
  303.                 if( !( providerUserKey is Guid ) )
  304.                 {
  305.                     status = MembershipCreateStatus.InvalidProviderUserKey;
  306.                     return null;
  307.                 }
  308.             }
  309.  
  310.             if( password.Length < MinRequiredPasswordLength )
  311.             {
  312.                 status = MembershipCreateStatus.InvalidPassword;
  313.                 return null;
  314.             }
  315.  
  316.             int count = 0;
  317.  
  318.             for( int i = 0; i < password.Length; i++ )
  319.             {
  320.                 if( !char.IsLetterOrDigit( password, i ) )
  321.                 {
  322.                     count++;
  323.                 }
  324.             }
  325.  
  326.             if( count < MinRequiredNonAlphanumericCharacters )
  327.             {
  328.                 status = MembershipCreateStatus.InvalidPassword;
  329.                 return null;
  330.             }
  331.  
  332.             if( PasswordStrengthRegularExpression.Length > 0 )
  333.             {
  334.                 if( !Regex.IsMatch( password, PasswordStrengthRegularExpression ) )
  335.                 {
  336.                     status = MembershipCreateStatus.InvalidPassword;
  337.                     return null;
  338.                 }
  339.             }
  340.  
  341.             ValidatePasswordEventArgs e = new ValidatePasswordEventArgs( username, password, true );
  342.             OnValidatingPassword( e );
  343.  
  344.             if( e.Cancel )
  345.             {
  346.                 status = MembershipCreateStatus.InvalidPassword;
  347.                 return null;
  348.             }
  349.  
  350.             try
  351.             {
  352.                 SqlConnectionHolder holder = null;
  353.                 try {
  354.                     holder = SqlConnectionHelper.GetConnection( _sqlConnectionString, true );
  355.                     CheckSchemaVersion( holder.Connection );
  356.  
  357.                     DateTime    dt  = RoundToSeconds(DateTime.UtcNow);
  358.                     SqlCommand  cmd = new SqlCommand("dbo.aspnet_Membership_CreateUser", holder.Connection);
  359.  
  360.                     cmd.CommandTimeout = CommandTimeout;
  361.                     cmd.CommandType = CommandType.StoredProcedure;
  362.                     cmd.Parameters.Add(CreateInputParam("@ApplicationName", SqlDbType.NVarChar, ApplicationName));
  363.                     cmd.Parameters.Add(CreateInputParam("@UserName", SqlDbType.NVarChar, username));
  364.                     cmd.Parameters.Add(CreateInputParam("@Password", SqlDbType.NVarChar, pass));
  365.                     cmd.Parameters.Add(CreateInputParam("@PasswordSalt", SqlDbType.NVarChar, salt));
  366.                     cmd.Parameters.Add(CreateInputParam("@Email", SqlDbType.NVarChar, email));
  367.                     cmd.Parameters.Add(CreateInputParam("@PasswordQuestion", SqlDbType.NVarChar, passwordQuestion));
  368.                     cmd.Parameters.Add(CreateInputParam("@PasswordAnswer", SqlDbType.NVarChar, encodedPasswordAnswer));
  369.                     cmd.Parameters.Add(CreateInputParam("@IsApproved", SqlDbType.Bit, isApproved));
  370.                     cmd.Parameters.Add(CreateInputParam("@UniqueEmail", SqlDbType.Int, RequiresUniqueEmail ? 1 : 0));
  371.                     cmd.Parameters.Add(CreateInputParam("@PasswordFormat", SqlDbType.Int, (int)PasswordFormat));
  372.                     cmd.Parameters.Add(CreateInputParam("@CurrentTimeUtc", SqlDbType.DateTime, dt));
  373.                     SqlParameter p = CreateInputParam("@UserId", SqlDbType.UniqueIdentifier, providerUserKey);
  374.                     p.Direction= ParameterDirection.InputOutput;
  375.                     cmd.Parameters.Add( p );
  376.  
  377.                     p = new SqlParameter("@ReturnValue", SqlDbType.Int);
  378.                     p.Direction = ParameterDirection.ReturnValue;
  379.                     cmd.Parameters.Add(p);
  380.  
  381.                     cmd.ExecuteNonQuery();
  382.                     int iStatus = ((p.Value!=null) ? ((int) p.Value) : -1);
  383.                     if (iStatus < 0 || iStatus > (int) MembershipCreateStatus.ProviderError)
  384.                         iStatus = (int) MembershipCreateStatus.ProviderError;
  385.                     status = (MembershipCreateStatus) iStatus;
  386.                     if (iStatus != 0) // !success
  387.                         return null;
  388.  
  389.                     providerUserKey = new Guid( cmd.Parameters[ "@UserId" ].Value.ToString() );
  390.                     dt = dt.ToLocalTime();
  391.                     return new MembershipUser( this.Name,
  392.                                                username,
  393.                                                providerUserKey,
  394.                                                email,
  395.                                                passwordQuestion,
  396.                                                null,
  397.                                                isApproved,
  398.                                                false,
  399.                                                dt,
  400.                                                dt,
  401.                                                dt,
  402.                                                dt,
  403.                                                new DateTime( 1754, 1, 1 ) );
  404.                 }
  405.                 finally
  406.                 {
  407.                     if( holder != null )
  408.                     {
  409.                         holder.Close();
  410.                         holder = null;
  411.                     }
  412.                 }
  413.             } catch {
  414.                 throw;
  415.             }
  416.         }
  417.  
  418.         //////////////////////////////////////////////////////////////////////
  419.         //////////////////////////////////////////////////////////////////////
  420.         //////////////////////////////////////////////////////////////////////
  421.  
  422.         public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
  423.         {
  424.             SecUtility.CheckParameter( ref username, true, true, true, 256, "username" );
  425.             SecUtility.CheckParameter( ref password, true, true, false, 128, "password" );
  426.  
  427.             string salt;
  428.             int passwordFormat;
  429.             if (!CheckPassword(username, password, false, false, out salt, out passwordFormat))
  430.                 return false;
  431.             SecUtility.CheckParameter(ref newPasswordQuestion, RequiresQuestionAndAnswer, RequiresQuestionAndAnswer, false, 256, "newPasswordQuestion");
  432.             string encodedPasswordAnswer;
  433.             if( newPasswordAnswer != null )
  434.             {
  435.                 newPasswordAnswer = newPasswordAnswer.Trim();
  436.             }
  437.  
  438.             SecUtility.CheckParameter(ref newPasswordAnswer, RequiresQuestionAndAnswer, RequiresQuestionAndAnswer, false, 128, "newPasswordAnswer");
  439.             if (!string.IsNullOrEmpty(newPasswordAnswer)) {
  440.                 encodedPasswordAnswer = EncodePassword(newPasswordAnswer.ToLower(CultureInfo.InvariantCulture), (int)passwordFormat, salt);
  441.             }
  442.             else
  443.                 encodedPasswordAnswer = newPasswordAnswer;
  444.             SecUtility.CheckParameter(ref encodedPasswordAnswer, RequiresQuestionAndAnswer, RequiresQuestionAndAnswer, false, 128, "newPasswordAnswer");
  445.  
  446.             try {
  447.                 SqlConnectionHolder holder = null;
  448.                 try {
  449.                     holder = SqlConnectionHelper.GetConnection( _sqlConnectionString, true );
  450.                     CheckSchemaVersion( holder.Connection );
  451.  
  452.                     SqlCommand    cmd     = new SqlCommand("dbo.aspnet_Membership_ChangePasswordQuestionAndAnswer", holder.Connection);
  453.  
  454.                     cmd.CommandTimeout = CommandTimeout;
  455.                     cmd.CommandType = CommandType.StoredProcedure;
  456.                     cmd.Parameters.Add(CreateInputParam("@ApplicationName", SqlDbType.NVarChar, ApplicationName));
  457.                     cmd.Parameters.Add(CreateInputParam("@UserName", SqlDbType.NVarChar, username));
  458.                     cmd.Parameters.Add(CreateInputParam("@NewPasswordQuestion", SqlDbType.NVarChar, newPasswordQuestion));
  459.                     cmd.Parameters.Add(CreateInputParam("@NewPasswordAnswer", SqlDbType.NVarChar, encodedPasswordAnswer));
  460.  
  461.                     SqlParameter p = new SqlParameter("@ReturnValue", SqlDbType.Int);
  462.                     p.Direction = ParameterDirection.ReturnValue;
  463.                     cmd.Parameters.Add(p);
  464.  
  465.                     cmd.ExecuteNonQuery();
  466.                     int status = ( ( p.Value != null ) ? ( ( int )p.Value ) : -1 );
  467.                     if( status != 0 )
  468.                     {
  469.                         throw new ProviderException( GetExceptionText( status ) );
  470.                     }
  471.  
  472.                     return ( status == 0 );
  473.                 }
  474.                 finally
  475.                 {
  476.                     if( holder != null )
  477.                     {
  478.                         holder.Close();
  479.                         holder = null;
  480.                     }
  481.                 }
  482.             } catch {
  483.                 throw;
  484.             }
  485.         }
  486.  
  487.         //////////////////////////////////////////////////////////////////////
  488.         //////////////////////////////////////////////////////////////////////
  489.         //////////////////////////////////////////////////////////////////////
  490.  
  491.         public override string GetPassword(string username, string passwordAnswer)
  492.         {
  493.             if ( !EnablePasswordRetrieval )
  494.             {
  495.                 throw new NotSupportedException( SR.GetString( SR.Membership_PasswordRetrieval_not_supported ) );
  496.             }
  497.  
  498.             SecUtility.CheckParameter( ref username, true, true, true, 256, "username" );
  499.  
  500.             string encodedPasswordAnswer = GetEncodedPasswordAnswer(username, passwordAnswer);
  501.             SecUtility.CheckParameter(ref encodedPasswordAnswer, RequiresQuestionAndAnswer, RequiresQuestionAndAnswer, false, 128, "passwordAnswer");
  502.  
  503.             string errText;
  504.             int passwordFormat = 0;
  505.             int status = 0;
  506.  
  507.             string pass = GetPasswordFromDB(username, encodedPasswordAnswer, RequiresQuestionAndAnswer, out passwordFormat, out status);
  508.  
  509.             if ( pass == null )
  510.             {
  511.                 errText = GetExceptionText( status );
  512.                 if ( IsStatusDueToBadPassword( status ) )
  513.                 {
  514.                     throw new MembershipPasswordException( errText );
  515.                 }
  516.                 else
  517.                 {
  518.                     throw new ProviderException( errText );
  519.                 }
  520.             }
  521.  
  522.             return UnEncodePassword( pass, passwordFormat );
  523.         }
  524.  
  525.         //////////////////////////////////////////////////////////////////////
  526.         //////////////////////////////////////////////////////////////////////
  527.         //////////////////////////////////////////////////////////////////////
  528.  
  529.         public override bool ChangePassword(string username, string oldPassword, string newPassword)
  530.         {
  531.             SecUtility.CheckParameter( ref username, true, true, true, 256, "username" );
  532.             SecUtility.CheckParameter( ref oldPassword, true, true, false, 128, "oldPassword" );
  533.             SecUtility.CheckParameter( ref newPassword, true, true, false, 128, "newPassword" );
  534.  
  535.             string salt = null;
  536.             int passwordFormat;
  537.             int status;
  538.  
  539.             if (!CheckPassword( username, oldPassword, false, false, out salt, out passwordFormat))
  540.             {
  541.                return false;
  542.             }
  543.  
  544.             if( newPassword.Length < MinRequiredPasswordLength )
  545.             {
  546.                 throw new ArgumentException(SR.GetString(
  547.                               SR.Password_too_short,
  548.                               "newPassword",
  549.                               MinRequiredPasswordLength.ToString(CultureInfo.InvariantCulture)));
  550.             }
  551.  
  552.             int count = 0;
  553.  
  554.             for( int i = 0; i < newPassword.Length; i++ )
  555.             {
  556.                 if( !char.IsLetterOrDigit( newPassword, i ) )
  557.                 {
  558.                     count++;
  559.                 }
  560.             }
  561.  
  562.             if( count < MinRequiredNonAlphanumericCharacters )
  563.             {
  564.                 throw new ArgumentException(SR.GetString(
  565.                               SR.Password_need_more_non_alpha_numeric_chars,
  566.                               "newPassword",
  567.                               MinRequiredNonAlphanumericCharacters.ToString(CultureInfo.InvariantCulture)));
  568.             }
  569.  
  570.             if( PasswordStrengthRegularExpression.Length > 0 )
  571.             {
  572.                 if( !Regex.IsMatch( newPassword, PasswordStrengthRegularExpression ) )
  573.                 {
  574.                     throw new ArgumentException(SR.GetString(SR.Password_does_not_match_regular_expression,
  575.                                                              "newPassword"));
  576.                 }
  577.             }
  578.  
  579.             string pass = EncodePassword(newPassword, (int)passwordFormat, salt);
  580.             if ( pass.Length > 128 )
  581.             {
  582.                 throw new ArgumentException(SR.GetString(SR.Membership_password_too_long), "newPassword");
  583.             }
  584.  
  585.             ValidatePasswordEventArgs e = new ValidatePasswordEventArgs( username, newPassword, false );
  586.             OnValidatingPassword( e );
  587.  
  588.             if( e.Cancel )
  589.             {
  590.                 if( e.FailureInformation != null )
  591.                 {
  592.                     throw e.FailureInformation;
  593.                 }
  594.                 else
  595.                 {
  596.                     throw new ArgumentException( SR.GetString( SR.Membership_Custom_Password_Validation_Failure ), "newPassword");
  597.                 }
  598.             }
  599.  
  600.  
  601.             try {
  602.                 SqlConnectionHolder holder = null;
  603.                 try {
  604.                     holder = SqlConnectionHelper.GetConnection( _sqlConnectionString, true );
  605.                     CheckSchemaVersion( holder.Connection );
  606.  
  607.                     SqlCommand  cmd = new SqlCommand( "dbo.aspnet_Membership_SetPassword", holder.Connection );
  608.  
  609.                     cmd.CommandTimeout = CommandTimeout;
  610.                     cmd.CommandType = CommandType.StoredProcedure;
  611.                     cmd.Parameters.Add(CreateInputParam("@ApplicationName", SqlDbType.NVarChar, ApplicationName));
  612.                     cmd.Parameters.Add(CreateInputParam("@UserName", SqlDbType.NVarChar, username));
  613.                     cmd.Parameters.Add(CreateInputParam("@NewPassword", SqlDbType.NVarChar, pass));
  614.                     cmd.Parameters.Add(CreateInputParam("@PasswordSalt", SqlDbType.NVarChar, salt));
  615.                     cmd.Parameters.Add(CreateInputParam("@PasswordFormat", SqlDbType.Int, passwordFormat));
  616.                     cmd.Parameters.Add(CreateInputParam("@CurrentTimeUtc", SqlDbType.DateTime, DateTime.UtcNow));
  617.  
  618.                     SqlParameter p = new SqlParameter("@ReturnValue", SqlDbType.Int);
  619.                     p.Direction = ParameterDirection.ReturnValue;
  620.                     cmd.Parameters.Add(p);
  621.  
  622.                     cmd.ExecuteNonQuery();
  623.  
  624.                     status =  ( ( p.Value != null ) ? ( ( int )p.Value ) : -1 );
  625.  
  626.                     if ( status != 0 )
  627.                     {
  628.                         string errText = GetExceptionText( status );
  629.  
  630.                         if ( IsStatusDueToBadPassword( status ) )
  631.                         {
  632.                             throw new MembershipPasswordException( errText );
  633.                         }
  634.                         else
  635.                         {
  636.                             throw new ProviderException( errText );
  637.                         }
  638.                     }
  639.  
  640.                     return true;
  641.                 }
  642.                 finally
  643.                 {
  644.                     if( holder != null )
  645.                     {
  646.                         holder.Close();
  647.                         holder = null;
  648.                     }
  649.                 }
  650.             } catch {
  651.                 throw;
  652.             }
  653.         }
  654.  
  655.         //////////////////////////////////////////////////////////////////////
  656.         //////////////////////////////////////////////////////////////////////
  657.         //////////////////////////////////////////////////////////////////////
  658.  
  659.         public override string ResetPassword( string username, string passwordAnswer )
  660.         {
  661.             if ( !EnablePasswordReset )
  662.             {
  663.                 throw new NotSupportedException( SR.GetString( SR.Not_configured_to_support_password_resets ) );
  664.             }
  665.  
  666.             SecUtility.CheckParameter( ref username, true, true, true, 256, "username" );
  667.  
  668.             string salt;
  669.             int passwordFormat;
  670.             string passwdFromDB;
  671.             int status;
  672.             int failedPasswordAttemptCount;
  673.             int failedPasswordAnswerAttemptCount;
  674.             bool isApproved;
  675.             DateTime lastLoginDate, lastActivityDate;
  676.  
  677.             GetPasswordWithFormat(username, false, out status, out passwdFromDB, out passwordFormat, out salt, out failedPasswordAttemptCount,
  678.                                   out failedPasswordAnswerAttemptCount, out isApproved, out lastLoginDate, out lastActivityDate);
  679.             if (status != 0)
  680.             {
  681.                 if (IsStatusDueToBadPassword(status))
  682.                 {
  683.                     throw new MembershipPasswordException(GetExceptionText(status));
  684.                 }
  685.                 else
  686.                 {
  687.                     throw new ProviderException(GetExceptionText(status));
  688.                 }
  689.             }
  690.  
  691.             string encodedPasswordAnswer;
  692.             if( passwordAnswer != null )
  693.             {
  694.                 passwordAnswer = passwordAnswer.Trim();
  695.             }
  696.             if (!string.IsNullOrEmpty(passwordAnswer))
  697.                 encodedPasswordAnswer = EncodePassword(passwordAnswer.ToLower(CultureInfo.InvariantCulture), passwordFormat, salt);
  698.             else
  699.                 encodedPasswordAnswer = passwordAnswer;
  700.             SecUtility.CheckParameter(ref encodedPasswordAnswer, RequiresQuestionAndAnswer, RequiresQuestionAndAnswer, false, 128, "passwordAnswer");
  701.             string newPassword  = GeneratePassword();
  702.  
  703.             ValidatePasswordEventArgs e = new ValidatePasswordEventArgs( username, newPassword, false );
  704.             OnValidatingPassword( e );
  705.  
  706.             if( e.Cancel )
  707.             {
  708.                 if( e.FailureInformation != null )
  709.                 {
  710.                     throw e.FailureInformation;
  711.                 }
  712.                 else
  713.                 {
  714.                     throw new ProviderException( SR.GetString( SR.Membership_Custom_Password_Validation_Failure ) );
  715.                 }
  716.             }
  717.  
  718.  
  719.             try
  720.             {
  721.                 SqlConnectionHolder holder = null;
  722.                 try {
  723.                     holder = SqlConnectionHelper.GetConnection( _sqlConnectionString, true );
  724.                     CheckSchemaVersion( holder.Connection );
  725.  
  726.                     SqlCommand    cmd     = new SqlCommand("dbo.aspnet_Membership_ResetPassword", holder.Connection);
  727.                     string        errText;
  728.  
  729.                     cmd.CommandTimeout = CommandTimeout;
  730.                     cmd.CommandType = CommandType.StoredProcedure;
  731.                     cmd.Parameters.Add(CreateInputParam("@ApplicationName", SqlDbType.NVarChar, ApplicationName));
  732.                     cmd.Parameters.Add(CreateInputParam("@UserName", SqlDbType.NVarChar, username));
  733.                     cmd.Parameters.Add(CreateInputParam("@NewPassword", SqlDbType.NVarChar, EncodePassword(newPassword, (int) passwordFormat, salt)));
  734.                     cmd.Parameters.Add(CreateInputParam("@MaxInvalidPasswordAttempts", SqlDbType.Int, MaxInvalidPasswordAttempts ) );
  735.                     cmd.Parameters.Add(CreateInputParam("@PasswordAttemptWindow", SqlDbType.Int, PasswordAttemptWindow ) );
  736.                     cmd.Parameters.Add(CreateInputParam("@PasswordSalt", SqlDbType.NVarChar, salt));
  737.                     cmd.Parameters.Add(CreateInputParam("@PasswordFormat", SqlDbType.Int, (int)passwordFormat));
  738.                     cmd.Parameters.Add(CreateInputParam("@CurrentTimeUtc", SqlDbType.DateTime, DateTime.UtcNow));
  739.                     if (RequiresQuestionAndAnswer) {
  740.                         cmd.Parameters.Add(CreateInputParam("@PasswordAnswer", SqlDbType.NVarChar, encodedPasswordAnswer));
  741.                     }
  742.  
  743.                     SqlParameter p = new SqlParameter("@ReturnValue", SqlDbType.Int);
  744.                     p.Direction = ParameterDirection.ReturnValue;
  745.                     cmd.Parameters.Add(p);
  746.  
  747.                     cmd.ExecuteNonQuery();
  748.  
  749.                     status = ( ( p.Value != null ) ? ( ( int )p.Value ) : -1 );
  750.  
  751.                     if ( status != 0 )
  752.                     {
  753.                         errText = GetExceptionText( status );
  754.  
  755.                         if ( IsStatusDueToBadPassword( status ) )
  756.                         {
  757.                             throw new MembershipPasswordException( errText );
  758.                         }
  759.                         else
  760.                         {
  761.                             throw new ProviderException( errText );
  762.                         }
  763.                     }
  764.  
  765.                     return newPassword;
  766.                 }
  767.                 finally
  768.                 {
  769.                     if( holder != null )
  770.                     {
  771.                         holder.Close();
  772.                         holder = null;
  773.                     }
  774.                 }
  775.             } catch {
  776.                 throw;
  777.             }
  778.         }
  779.  
  780.         //////////////////////////////////////////////////////////////////////
  781.         //////////////////////////////////////////////////////////////////////
  782.         //////////////////////////////////////////////////////////////////////
  783.  
  784.         public override void UpdateUser(MembershipUser user)
  785.         {
  786.             if( user == null )
  787.             {
  788.                 throw new ArgumentNullException( "user" );
  789.             }
  790.  
  791.             string temp = user.UserName;
  792.             SecUtility.CheckParameter( ref temp, true, true, true, 256, "UserName" );
  793.             temp = user.Email;
  794.             SecUtility.CheckParameter( ref temp,
  795.                                        RequiresUniqueEmail,
  796.                                        RequiresUniqueEmail,
  797.                                        false,
  798.                                        256,
  799.                                        "Email");
  800.             user.Email = temp;
  801.             try {
  802.                 SqlConnectionHolder holder = null;
  803.                 try {
  804.                     holder = SqlConnectionHelper.GetConnection( _sqlConnectionString, true );
  805.                     CheckSchemaVersion( holder.Connection );
  806.  
  807.                     SqlCommand    cmd     = new SqlCommand("dbo.aspnet_Membership_UpdateUser", holder.Connection);
  808.  
  809.                     cmd.CommandTimeout = CommandTimeout;
  810.                     cmd.CommandType = CommandType.StoredProcedure;
  811.                     cmd.Parameters.Add(CreateInputParam("@ApplicationName", SqlDbType.NVarChar, ApplicationName));
  812.                     cmd.Parameters.Add(CreateInputParam("@UserName", SqlDbType.NVarChar, user.UserName));
  813.                     cmd.Parameters.Add(CreateInputParam("@Email", SqlDbType.NVarChar, user.Email));
  814.                     cmd.Parameters.Add(CreateInputParam("@Comment", SqlDbType.NText, user.Comment));
  815.                     cmd.Parameters.Add(CreateInputParam("@IsApproved", SqlDbType.Bit, user.IsApproved ? 1 : 0));
  816.                     cmd.Parameters.Add(CreateInputParam("@LastLoginDate", SqlDbType.DateTime, user.LastLoginDate.ToUniversalTime()));
  817.                     cmd.Parameters.Add(CreateInputParam("@LastActivityDate", SqlDbType.DateTime, user.LastActivityDate.ToUniversalTime()));
  818.                     cmd.Parameters.Add(CreateInputParam("@UniqueEmail", SqlDbType.Int, RequiresUniqueEmail ? 1 : 0));
  819.                     cmd.Parameters.Add(CreateInputParam("@CurrentTimeUtc", SqlDbType.DateTime, DateTime.UtcNow));
  820.  
  821.                     SqlParameter p = new SqlParameter("@ReturnValue", SqlDbType.Int);
  822.                     p.Direction = ParameterDirection.ReturnValue;
  823.                     cmd.Parameters.Add(p);
  824.                     cmd.ExecuteNonQuery();
  825.                     int status = ((p.Value!=null) ? ((int) p.Value) : -1);
  826.                     if (status != 0)
  827.                         throw new ProviderException(GetExceptionText(status));
  828.                     return;
  829.                 }
  830.                 finally
  831.                 {
  832.                     if( holder != null )
  833.                     {
  834.                         holder.Close();
  835.                         holder = null;
  836.                     }
  837.                 }
  838.             } catch {
  839.                 throw;
  840.             }
  841.         }
  842.  
  843.         //////////////////////////////////////////////////////////////////////
  844.         //////////////////////////////////////////////////////////////////////
  845.         //////////////////////////////////////////////////////////////////////
  846.  
  847.         public override bool ValidateUser(string username, string password)
  848.         {
  849.             if (    SecUtility.ValidateParameter(ref username, true, true, true, 256) &&
  850.                     SecUtility.ValidateParameter(ref password, true, true, false, 128) &&
  851.                     CheckPassword(username, password, true, true))
  852.             {
  853.                 // Comment out perf counters in sample: PerfCounters.IncrementCounter(AppPerfCounter.MEMBER_SUCCESS);
  854.                 // Comment out events in sample: WebBaseEvent.RaiseSystemEvent(null, WebEventCodes.AuditMembershipAuthenticationSuccess, username);
  855.                 return true;
  856.             } else {
  857.                 // Comment out perf counters in sample: PerfCounters.IncrementCounter(AppPerfCounter.MEMBER_FAIL);
  858.                 // Comment out events in sample: WebBaseEvent.RaiseSystemEvent(null, WebEventCodes.AuditMembershipAuthenticationFailure, username);
  859.                 return false;
  860.             }
  861.         }
  862.  
  863.         public override bool UnlockUser( string username )
  864.         {
  865.             SecUtility.CheckParameter(ref username, true, true, true, 256, "username" );
  866.             try {
  867.                 SqlConnectionHolder holder = null;
  868.                 try {
  869.                     holder = SqlConnectionHelper.GetConnection( _sqlConnectionString, true );
  870.                     CheckSchemaVersion(holder.Connection);
  871.  
  872.                     SqlCommand cmd = new SqlCommand("dbo.aspnet_Membership_UnlockUser", holder.Connection);
  873.  
  874.                     cmd.CommandTimeout = CommandTimeout;
  875.                     cmd.CommandType = CommandType.StoredProcedure;
  876.                     cmd.Parameters.Add(CreateInputParam("@ApplicationName", SqlDbType.NVarChar, ApplicationName));
  877.                     cmd.Parameters.Add(CreateInputParam("@UserName", SqlDbType.NVarChar, username));
  878.  
  879.                     SqlParameter p = new SqlParameter("@ReturnValue", SqlDbType.Int);
  880.                     p.Direction = ParameterDirection.ReturnValue;
  881.                     cmd.Parameters.Add(p);
  882.  
  883.                     cmd.ExecuteNonQuery();
  884.  
  885.                     int status = ((p.Value != null) ? ((int)p.Value) : -1);
  886.                     if (status == 0) {
  887.                         return true;
  888.                     }
  889.  
  890.                     return false;
  891.                 }
  892.                 finally {
  893.                     if( holder != null )
  894.                     {
  895.                         holder.Close();
  896.                         holder = null;
  897.                     }
  898.                 }
  899.             } catch {
  900.                 throw;
  901.             }
  902.         }
  903.  
  904.         public override MembershipUser GetUser( object providerUserKey, bool userIsOnline )
  905.         {
  906.             if( providerUserKey == null )
  907.             {
  908.                 throw new ArgumentNullException( "providerUserKey" );
  909.             }
  910.  
  911.             if ( !( providerUserKey is Guid ) )
  912.             {
  913.                 throw new ArgumentException( SR.GetString( SR.Membership_InvalidProviderUserKey ), "providerUserKey" );
  914.             }
  915.  
  916.             SqlDataReader       reader = null;
  917.  
  918.             try {
  919.                 SqlConnectionHolder holder = null;
  920.                 try {
  921.                     holder = SqlConnectionHelper.GetConnection( _sqlConnectionString, true );
  922.                     CheckSchemaVersion( holder.Connection );
  923.  
  924.                     SqlCommand    cmd     = new SqlCommand( "dbo.aspnet_Membership_GetUserByUserId", holder.Connection );
  925.  
  926.                     cmd.CommandTimeout = CommandTimeout;
  927.                     cmd.CommandType = CommandType.StoredProcedure;
  928.                     cmd.Parameters.Add(CreateInputParam("@UserId", SqlDbType.UniqueIdentifier, providerUserKey ) );
  929.                     cmd.Parameters.Add(CreateInputParam("@UpdateLastActivity", SqlDbType.Bit, userIsOnline));
  930.                     cmd.Parameters.Add(CreateInputParam("@CurrentTimeUtc", SqlDbType.DateTime, DateTime.UtcNow));
  931.                     SqlParameter p = new SqlParameter("@ReturnValue", SqlDbType.Int);
  932.                     p.Direction = ParameterDirection.ReturnValue;
  933.                     cmd.Parameters.Add(p);
  934.  
  935.                     reader = cmd.ExecuteReader();
  936.                     if ( reader.Read() )
  937.                     {
  938.                         string email = GetNullableString(reader, 0);
  939.                         string passwordQuestion = GetNullableString( reader, 1 );
  940.                         string comment = GetNullableString(reader, 2);
  941.                         bool isApproved = reader.GetBoolean(3);
  942.                         DateTime dtCreate = reader.GetDateTime(4).ToLocalTime();
  943.                         DateTime dtLastLogin = reader.GetDateTime(5).ToLocalTime();
  944.                         DateTime dtLastActivity = reader.GetDateTime(6).ToLocalTime();
  945.                         DateTime dtLastPassChange = reader.GetDateTime(7).ToLocalTime();
  946.                         string userName = GetNullableString(reader, 8);
  947.                         bool isLockedOut = reader.GetBoolean(9);
  948.                         DateTime dtLastLockoutDate = reader.GetDateTime(10).ToLocalTime();
  949.  
  950.                         ////////////////////////////////////////////////////////////
  951.                         // Step 4 : Return the result
  952.                         return new MembershipUser( this.Name,
  953.                                                    userName,
  954.                                                    providerUserKey,
  955.                                                    email,
  956.                                                    passwordQuestion,
  957.                                                    comment,
  958.                                                    isApproved,
  959.                                                    isLockedOut,
  960.                                                    dtCreate,
  961.                                                    dtLastLogin,
  962.                                                    dtLastActivity,
  963.                                                    dtLastPassChange,
  964.                                                    dtLastLockoutDate );
  965.                     }
  966.  
  967.                     return null;
  968.                 }
  969.                 finally
  970.                 {
  971.                     if ( reader != null )
  972.                     {
  973.                         reader.Close();
  974.                         reader = null;
  975.                     }
  976.  
  977.                     if( holder != null )
  978.                     {
  979.                         holder.Close();
  980.                         holder = null;
  981.                     }
  982.                 }
  983.             }
  984.             catch
  985.             {
  986.                 throw;
  987.             }
  988.         }
  989.  
  990.         //////////////////////////////////////////////////////////////////////
  991.         //////////////////////////////////////////////////////////////////////
  992.         //////////////////////////////////////////////////////////////////////
  993.  
  994.         public override MembershipUser GetUser(string username, bool userIsOnline)
  995.         {
  996.             SecUtility.CheckParameter(
  997.                             ref username,
  998.                             true,
  999.                             false,
  1000.                             true,
  1001.                             256,
  1002.                             "username" );
  1003.  
  1004.             SqlDataReader        reader = null;
  1005.  
  1006.             try {
  1007.                 SqlConnectionHolder holder = null;
  1008.                 try {
  1009.                     holder = SqlConnectionHelper.GetConnection( _sqlConnectionString, true );
  1010.                     CheckSchemaVersion( holder.Connection );
  1011.  
  1012.                     SqlCommand    cmd     = new SqlCommand("dbo.aspnet_Membership_GetUserByName", holder.Connection);
  1013.  
  1014.                     cmd.CommandTimeout = CommandTimeout;
  1015.                     cmd.CommandType = CommandType.StoredProcedure;
  1016.                     cmd.Parameters.Add(CreateInputParam("@ApplicationName", SqlDbType.NVarChar, ApplicationName));
  1017.                     cmd.Parameters.Add(CreateInputParam("@UserName", SqlDbType.NVarChar, username));
  1018.                     cmd.Parameters.Add(CreateInputParam("@UpdateLastActivity", SqlDbType.Bit, userIsOnline));
  1019.                     cmd.Parameters.Add(CreateInputParam("@CurrentTimeUtc", SqlDbType.DateTime, DateTime.UtcNow));
  1020.                     SqlParameter p = new SqlParameter("@ReturnValue", SqlDbType.Int);
  1021.                     p.Direction = ParameterDirection.ReturnValue;
  1022.                     cmd.Parameters.Add(p);
  1023.  
  1024.                     reader = cmd.ExecuteReader();
  1025.                     if ( reader.Read() )
  1026.                     {
  1027.                         string email = GetNullableString(reader, 0);
  1028.                         string passwordQuestion = GetNullableString( reader, 1 );
  1029.                         string comment = GetNullableString(reader, 2);
  1030.                         bool isApproved = reader.GetBoolean(3);
  1031.                         DateTime dtCreate = reader.GetDateTime(4).ToLocalTime();
  1032.                         DateTime dtLastLogin = reader.GetDateTime(5).ToLocalTime();
  1033.                         DateTime dtLastActivity = reader.GetDateTime(6).ToLocalTime();
  1034.                         DateTime dtLastPassChange = reader.GetDateTime(7).ToLocalTime();
  1035.                         Guid userId = reader.GetGuid( 8 );
  1036.                         bool isLockedOut = reader.GetBoolean( 9 );
  1037.                         DateTime dtLastLockoutDate = reader.GetDateTime(10).ToLocalTime();
  1038.  
  1039.                         ////////////////////////////////////////////////////////////
  1040.                         // Step 4 : Return the result
  1041.                         return new MembershipUser( this.Name,
  1042.                                                    username,
  1043.                                                    userId,
  1044.                                                    email,
  1045.                                                    passwordQuestion,
  1046.                                                    comment,
  1047.                                                    isApproved,
  1048.                                                    isLockedOut,
  1049.                                                    dtCreate,
  1050.                                                    dtLastLogin,
  1051.                                                    dtLastActivity,
  1052.                                                    dtLastPassChange,
  1053.                                                    dtLastLockoutDate );
  1054.                     }
  1055.  
  1056.                     return null;
  1057.  
  1058.                 }
  1059.                 finally
  1060.                 {
  1061.                     if ( reader != null )
  1062.                     {
  1063.                         reader.Close();
  1064.                         reader = null;
  1065.                     }
  1066.  
  1067.                     if( holder != null )
  1068.                     {
  1069.                         holder.Close();
  1070.                         holder = null;
  1071.                     }
  1072.                 }
  1073.             }
  1074.             catch
  1075.             {
  1076.                 throw;
  1077.             }
  1078.         }
  1079.  
  1080.         //////////////////////////////////////////////////////////////////////
  1081.         //////////////////////////////////////////////////////////////////////
  1082.         //////////////////////////////////////////////////////////////////////
  1083.  
  1084.         public override string GetUserNameByEmail(string email)
  1085.         {
  1086.             SecUtility.CheckParameter(
  1087.                             ref email,
  1088.                             false,
  1089.                             false,
  1090.                             false,
  1091.                             256,
  1092.                             "email" );
  1093.  
  1094.  
  1095.             try {
  1096.                 SqlConnectionHolder holder = null;
  1097.                 try {
  1098.                     holder = SqlConnectionHelper.GetConnection(_sqlConnectionString, true);
  1099.                     CheckSchemaVersion( holder.Connection );
  1100.  
  1101.                     SqlCommand    cmd         = new SqlCommand("dbo.aspnet_Membership_GetUserByEmail", holder.Connection);
  1102.                     string        username    = null;
  1103.                     SqlDataReader reader      = null;
  1104.  
  1105.                     cmd.CommandTimeout = CommandTimeout;
  1106.                     cmd.CommandType = CommandType.StoredProcedure;
  1107.                     cmd.Parameters.Add(CreateInputParam("@ApplicationName", SqlDbType.NVarChar, ApplicationName));
  1108.                     cmd.Parameters.Add(CreateInputParam("@Email", SqlDbType.NVarChar, email));
  1109.  
  1110.                     SqlParameter p = new SqlParameter("@ReturnValue", SqlDbType.Int);
  1111.                     p.Direction = ParameterDirection.ReturnValue;
  1112.                     cmd.Parameters.Add(p);
  1113.                     try {
  1114.                         reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
  1115.                         if (reader.Read())
  1116.                         {
  1117.                             username = GetNullableString( reader, 0 );
  1118.                             if ( RequiresUniqueEmail && reader.Read() )
  1119.                             {
  1120.                                 throw new ProviderException(SR.GetString(SR.Membership_more_than_one_user_with_email));
  1121.                             }
  1122.                         }
  1123.                     }
  1124.                     finally
  1125.                     {
  1126.                         if (reader != null)
  1127.                             reader.Close();
  1128.                     }
  1129.                     return username;
  1130.                 }
  1131.                 finally
  1132.                 {
  1133.                     if( holder != null )
  1134.                     {
  1135.                         holder.Close();
  1136.                         holder = null;
  1137.                     }
  1138.                 }
  1139.             } catch {
  1140.                 throw;
  1141.             }
  1142.         }
  1143.  
  1144.         //////////////////////////////////////////////////////////////////////
  1145.         //////////////////////////////////////////////////////////////////////
  1146.         //////////////////////////////////////////////////////////////////////
  1147.  
  1148.         public override bool DeleteUser(string username, bool deleteAllRelatedData)
  1149.         {
  1150.             SecUtility.CheckParameter( ref username, true, true, true, 256, "username" );
  1151.  
  1152.             try {
  1153.                 SqlConnectionHolder holder = null;
  1154.                 try {
  1155.                     holder = SqlConnectionHelper.GetConnection(_sqlConnectionString, true);
  1156.                     CheckSchemaVersion( holder.Connection );
  1157.                     SqlCommand cmd = new SqlCommand("dbo.aspnet_Users_DeleteUser", holder.Connection);
  1158.  
  1159.                     cmd.CommandTimeout = CommandTimeout;
  1160.                     cmd.CommandType = CommandType.StoredProcedure;
  1161.                     cmd.Parameters.Add(CreateInputParam("@ApplicationName", SqlDbType.NVarChar, ApplicationName));
  1162.                     cmd.Parameters.Add(CreateInputParam("@UserName", SqlDbType.NVarChar, username));
  1163.  
  1164.                     if( deleteAllRelatedData )
  1165.                     {
  1166.                         cmd.Parameters.Add(CreateInputParam("@TablesToDeleteFrom", SqlDbType.Int, 0xF));
  1167.                     }
  1168.                     else
  1169.                     {
  1170.                         cmd.Parameters.Add(CreateInputParam("@TablesToDeleteFrom", SqlDbType.Int, 1));
  1171.                     }
  1172.  
  1173.                     SqlParameter p = new SqlParameter("@NumTablesDeletedFrom", SqlDbType.Int);
  1174.                     p.Direction = ParameterDirection.Output;
  1175.                     cmd.Parameters.Add(p);
  1176.                     cmd.ExecuteNonQuery();
  1177.  
  1178.                     int status = ( ( p.Value != null ) ? ( ( int )p.Value ) : -1 );
  1179.  
  1180.                     return ( status > 0 );
  1181.                 }
  1182.                 finally
  1183.                 {
  1184.                     if( holder != null )
  1185.                     {
  1186.                         holder.Close();
  1187.                         holder = null;
  1188.                     }
  1189.                 }
  1190.             } catch {
  1191.                 throw;
  1192.             }
  1193.         }
  1194.  
  1195.  
  1196.         //////////////////////////////////////////////////////////////////////
  1197.         //////////////////////////////////////////////////////////////////////
  1198.         //////////////////////////////////////////////////////////////////////
  1199.  
  1200.  
  1201.         public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
  1202.         {
  1203.             if ( pageIndex < 0 )
  1204.                 throw new ArgumentException(SR.GetString(SR.PageIndex_bad), "pageIndex");
  1205.             if ( pageSize < 1 )
  1206.                 throw new ArgumentException(SR.GetString(SR.PageSize_bad), "pageSize");
  1207.  
  1208.             long upperBound = (long)pageIndex * pageSize + pageSize - 1;
  1209.             if ( upperBound > Int32.MaxValue )
  1210.                 throw new ArgumentException(SR.GetString(SR.PageIndex_PageSize_bad), "pageIndex and pageSize");
  1211.  
  1212.             MembershipUserCollection users   = new MembershipUserCollection();
  1213.             totalRecords = 0;
  1214.             try {
  1215.                 SqlConnectionHolder holder = null;
  1216.                 try {
  1217.                     holder = SqlConnectionHelper.GetConnection(_sqlConnectionString, true);
  1218.                     CheckSchemaVersion( holder.Connection );
  1219.  
  1220.                     SqlCommand               cmd     = new SqlCommand("dbo.aspnet_Membership_GetAllUsers", holder.Connection);
  1221.                     SqlDataReader            reader  = null;
  1222.                     SqlParameter             p       = new SqlParameter("@ReturnValue", SqlDbType.Int);
  1223.  
  1224.                     cmd.CommandTimeout = CommandTimeout;
  1225.                     cmd.CommandType = CommandType.StoredProcedure;
  1226.                     cmd.Parameters.Add(CreateInputParam("@ApplicationName", SqlDbType.NVarChar, ApplicationName));
  1227.                     cmd.Parameters.Add(CreateInputParam("@PageIndex", SqlDbType.Int, pageIndex));
  1228.                     cmd.Parameters.Add(CreateInputParam("@PageSize", SqlDbType.Int, pageSize));
  1229.                     p.Direction = ParameterDirection.ReturnValue;
  1230.                     cmd.Parameters.Add(p);
  1231.                     try {
  1232.                         reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
  1233.                         while (reader.Read()) {
  1234.                             string username, email, passwordQuestion, comment;
  1235.                             bool isApproved;
  1236.                             DateTime dtCreate, dtLastLogin, dtLastActivity, dtLastPassChange;
  1237.                             Guid userId;
  1238.                             bool isLockedOut;
  1239.                             DateTime dtLastLockoutDate;
  1240.  
  1241.                             username = GetNullableString( reader, 0 );
  1242.                             email = GetNullableString(reader, 1);
  1243.                             passwordQuestion = GetNullableString( reader, 2 );
  1244.                             comment = GetNullableString(reader, 3);
  1245.                             isApproved = reader.GetBoolean(4);
  1246.                             dtCreate = reader.GetDateTime(5).ToLocalTime();
  1247.                             dtLastLogin = reader.GetDateTime(6).ToLocalTime();
  1248.                             dtLastActivity = reader.GetDateTime(7).ToLocalTime();
  1249.                             dtLastPassChange = reader.GetDateTime(8).ToLocalTime();
  1250.                             userId = reader.GetGuid( 9 );
  1251.                             isLockedOut = reader.GetBoolean( 10 );
  1252.                             dtLastLockoutDate = reader.GetDateTime(11).ToLocalTime();
  1253.  
  1254.                             users.Add( new MembershipUser( this.Name,
  1255.                                                            username,
  1256.                                                            userId,
  1257.                                                            email,
  1258.                                                            passwordQuestion,
  1259.                                                            comment,
  1260.                                                            isApproved,
  1261.                                                            isLockedOut,
  1262.                                                            dtCreate,
  1263.                                                            dtLastLogin,
  1264.                                                            dtLastActivity,
  1265.                                                            dtLastPassChange,
  1266.                                                            dtLastLockoutDate ) );
  1267.                         }
  1268.                     }
  1269.                     finally
  1270.                     {
  1271.                         if (reader != null)
  1272.                             reader.Close();
  1273.                         if (p.Value != null && p.Value is int)
  1274.                             totalRecords = (int)p.Value;
  1275.                     }
  1276.                 }
  1277.                 finally
  1278.                 {
  1279.                     if( holder != null )
  1280.                     {
  1281.                         holder.Close();
  1282.                         holder = null;
  1283.                     }
  1284.                 }
  1285.             } catch {
  1286.                 throw;
  1287.             }
  1288.             return users;
  1289.         }
  1290.         /////////////////////////////////////////////////////////////////////////////
  1291.         /////////////////////////////////////////////////////////////////////////////
  1292.         /////////////////////////////////////////////////////////////////////////////
  1293.  
  1294.         public override int GetNumberOfUsersOnline()
  1295.         {
  1296.  
  1297.             try {
  1298.                 SqlConnectionHolder holder = null;
  1299.                 try {
  1300.                     holder = SqlConnectionHelper.GetConnection(_sqlConnectionString, true);
  1301.                     CheckSchemaVersion( holder.Connection );
  1302.  
  1303.                     SqlCommand    cmd     = new SqlCommand("dbo.aspnet_Membership_GetNumberOfUsersOnline", holder.Connection);
  1304.                     SqlParameter  p       = new SqlParameter("@ReturnValue", SqlDbType.Int);
  1305.  
  1306.                     cmd.CommandTimeout = CommandTimeout;
  1307.                     cmd.CommandType = CommandType.StoredProcedure;
  1308.                     cmd.Parameters.Add(CreateInputParam("@ApplicationName", SqlDbType.NVarChar, ApplicationName));
  1309.                     cmd.Parameters.Add(CreateInputParam("@MinutesSinceLastInActive", SqlDbType.Int, Membership.UserIsOnlineTimeWindow));
  1310.                     cmd.Parameters.Add(CreateInputParam("@CurrentTimeUtc", SqlDbType.DateTime, DateTime.UtcNow));
  1311.                     p.Direction = ParameterDirection.ReturnValue;
  1312.                     cmd.Parameters.Add(p);
  1313.                     cmd.ExecuteNonQuery();
  1314.                     int num = ((p.Value!=null) ? ((int) p.Value) : -1);
  1315.                     return num;
  1316.                 }
  1317.                 finally
  1318.                 {
  1319.                     if( holder != null )
  1320.                     {
  1321.                         holder.Close();
  1322.                         holder = null;
  1323.                     }
  1324.                 }
  1325.             } catch {
  1326.                 throw;
  1327.             }
  1328.         }
  1329.  
  1330.         /////////////////////////////////////////////////////////////////////////////
  1331.         /////////////////////////////////////////////////////////////////////////////
  1332.         /////////////////////////////////////////////////////////////////////////////
  1333.  
  1334.         public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
  1335.         {
  1336.             SecUtility.CheckParameter(ref usernameToMatch, true, true, false, 256, "usernameToMatch");
  1337.  
  1338.             if ( pageIndex < 0 )
  1339.                 throw new ArgumentException(SR.GetString(SR.PageIndex_bad), "pageIndex");
  1340.             if ( pageSize < 1 )
  1341.                 throw new ArgumentException(SR.GetString(SR.PageSize_bad), "pageSize");
  1342.  
  1343.             long upperBound = (long)pageIndex * pageSize + pageSize - 1;
  1344.             if ( upperBound > Int32.MaxValue )
  1345.                 throw new ArgumentException(SR.GetString(SR.PageIndex_PageSize_bad), "pageIndex and pageSize");
  1346.  
  1347.             try
  1348.             {
  1349.                 SqlConnectionHolder holder = null;
  1350.                 totalRecords = 0;
  1351.                 SqlParameter p = new SqlParameter("@ReturnValue", SqlDbType.Int);
  1352.                 p.Direction = ParameterDirection.ReturnValue;
  1353.                 try {
  1354.                     holder = SqlConnectionHelper.GetConnection(_sqlConnectionString, true);
  1355.                     CheckSchemaVersion( holder.Connection );
  1356.  
  1357.                     SqlCommand cmd = new SqlCommand("dbo.aspnet_Membership_FindUsersByName", holder.Connection);
  1358.                     MembershipUserCollection users = new MembershipUserCollection();
  1359.                     SqlDataReader reader = null;
  1360.  
  1361.                     cmd.CommandTimeout = CommandTimeout;
  1362.                     cmd.CommandType = CommandType.StoredProcedure;
  1363.                     cmd.Parameters.Add(CreateInputParam("@ApplicationName", SqlDbType.NVarChar, ApplicationName));
  1364.                     cmd.Parameters.Add(CreateInputParam("@UserNameToMatch", SqlDbType.NVarChar, usernameToMatch));
  1365.                     cmd.Parameters.Add(CreateInputParam("@PageIndex", SqlDbType.Int, pageIndex));
  1366.                     cmd.Parameters.Add(CreateInputParam("@PageSize", SqlDbType.Int, pageSize));
  1367.                     cmd.Parameters.Add(p);
  1368.                     try
  1369.                     {
  1370.                         reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
  1371.                         while (reader.Read())
  1372.                         {
  1373.                             string username, email, passwordQuestion, comment;
  1374.                             bool isApproved;
  1375.                             DateTime dtCreate, dtLastLogin, dtLastActivity, dtLastPassChange;
  1376.                             Guid userId;
  1377.                             bool isLockedOut;
  1378.                             DateTime dtLastLockoutDate;
  1379.  
  1380.                             username = GetNullableString( reader, 0 );
  1381.                             email = GetNullableString(reader, 1);
  1382.                             passwordQuestion = GetNullableString( reader, 2 );
  1383.                             comment = GetNullableString(reader, 3);
  1384.                             isApproved = reader.GetBoolean(4);
  1385.                             dtCreate = reader.GetDateTime(5).ToLocalTime();
  1386.                             dtLastLogin = reader.GetDateTime(6).ToLocalTime();
  1387.                             dtLastActivity = reader.GetDateTime(7).ToLocalTime();
  1388.                             dtLastPassChange = reader.GetDateTime(8).ToLocalTime();
  1389.                             userId = reader.GetGuid( 9 );
  1390.                             isLockedOut = reader.GetBoolean( 10 );
  1391.                             dtLastLockoutDate = reader.GetDateTime(11).ToLocalTime();
  1392.  
  1393.                             users.Add( new MembershipUser( this.Name,
  1394.                                                            username,
  1395.                                                            userId,
  1396.                                                            email,
  1397.                                                            passwordQuestion,
  1398.                                                            comment,
  1399.                                                            isApproved,
  1400.                                                            isLockedOut,
  1401.                                                            dtCreate,
  1402.                                                            dtLastLogin,
  1403.                                                            dtLastActivity,
  1404.                                                            dtLastPassChange,
  1405.                                                            dtLastLockoutDate ) );
  1406.                         }
  1407.  
  1408.                         return users;
  1409.                     }
  1410.                     finally
  1411.                     {
  1412.                         if (reader != null)
  1413.                             reader.Close();
  1414.                         if (p.Value != null && p.Value is int)
  1415.                             totalRecords = (int) p.Value;
  1416.                     }
  1417.                 }
  1418.                 finally
  1419.                 {
  1420.                     if( holder != null )
  1421.                     {
  1422.                         holder.Close();
  1423.                         holder = null;
  1424.                     }
  1425.                 }
  1426.             } catch {
  1427.                 throw;
  1428.             }
  1429.         }
  1430.         /////////////////////////////////////////////////////////////////////////////
  1431.         /////////////////////////////////////////////////////////////////////////////
  1432.         /////////////////////////////////////////////////////////////////////////////
  1433.         public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
  1434.         {
  1435.             SecUtility.CheckParameter(ref emailToMatch, false, false, false, 256, "emailToMatch");
  1436.  
  1437.             if ( pageIndex < 0 )
  1438.                 throw new ArgumentException(SR.GetString(SR.PageIndex_bad), "pageIndex");
  1439.             if ( pageSize < 1 )
  1440.                 throw new ArgumentException(SR.GetString(SR.PageSize_bad), "pageSize");
  1441.  
  1442.             long upperBound = (long)pageIndex * pageSize + pageSize - 1;
  1443.             if ( upperBound > Int32.MaxValue )
  1444.                 throw new ArgumentException(SR.GetString(SR.PageIndex_PageSize_bad), "pageIndex and pageSize");
  1445.  
  1446.             try {
  1447.                 SqlConnectionHolder holder = null;
  1448.                 totalRecords = 0;
  1449.                 SqlParameter p = new SqlParameter("@ReturnValue", SqlDbType.Int);
  1450.                 p.Direction = ParameterDirection.ReturnValue;
  1451.                 try {
  1452.                     holder = SqlConnectionHelper.GetConnection(_sqlConnectionString, true);
  1453.                     CheckSchemaVersion( holder.Connection );
  1454.  
  1455.                     SqlCommand cmd = new SqlCommand("dbo.aspnet_Membership_FindUsersByEmail", holder.Connection);
  1456.                     MembershipUserCollection users = new MembershipUserCollection();
  1457.                     SqlDataReader reader = null;
  1458.  
  1459.                     cmd.CommandTimeout = CommandTimeout;
  1460.                     cmd.CommandType = CommandType.StoredProcedure;
  1461.                     cmd.Parameters.Add(CreateInputParam("@ApplicationName", SqlDbType.NVarChar, ApplicationName));
  1462.                     cmd.Parameters.Add(CreateInputParam("@EmailToMatch", SqlDbType.NVarChar, emailToMatch));
  1463.                     cmd.Parameters.Add(CreateInputParam("@PageIndex", SqlDbType.Int, pageIndex));
  1464.                     cmd.Parameters.Add(CreateInputParam("@PageSize", SqlDbType.Int, pageSize));
  1465.                     cmd.Parameters.Add(p);
  1466.                     try {
  1467.                         reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
  1468.                         while (reader.Read()) {
  1469.                             string username, email, passwordQuestion, comment;
  1470.                             bool isApproved;
  1471.                             DateTime dtCreate, dtLastLogin, dtLastActivity, dtLastPassChange;
  1472.                             Guid userId;
  1473.                             bool isLockedOut;
  1474.                             DateTime dtLastLockoutDate;
  1475.  
  1476.                             username = GetNullableString( reader, 0 );
  1477.                             email = GetNullableString(reader, 1);
  1478.                             passwordQuestion = GetNullableString( reader, 2 );
  1479.                             comment = GetNullableString(reader, 3);
  1480.                             isApproved = reader.GetBoolean(4);
  1481.                             dtCreate = reader.GetDateTime(5).ToLocalTime();
  1482.                             dtLastLogin = reader.GetDateTime(6).ToLocalTime();
  1483.                             dtLastActivity = reader.GetDateTime(7).ToLocalTime();
  1484.                             dtLastPassChange = reader.GetDateTime(8).ToLocalTime();
  1485.                             userId = reader.GetGuid( 9 );
  1486.                             isLockedOut = reader.GetBoolean( 10 );
  1487.                             dtLastLockoutDate = reader.GetDateTime(11).ToLocalTime();
  1488.  
  1489.                             users.Add( new MembershipUser( this.Name,
  1490.                                                            username,
  1491.                                                            userId,
  1492.                                                            email,
  1493.                                                            passwordQuestion,
  1494.                                                            comment,
  1495.                                                            isApproved,
  1496.                                                            isLockedOut,
  1497.                                                            dtCreate,
  1498.                                                            dtLastLogin,
  1499.                                                            dtLastActivity,
  1500.                                                            dtLastPassChange,
  1501.                                                            dtLastLockoutDate ) );
  1502.                         }
  1503.  
  1504.                         return users;
  1505.                     }
  1506.                     finally
  1507.                     {
  1508.                         if (reader != null)
  1509.                             reader.Close();
  1510.                         if (p.Value != null && p.Value is int)
  1511.                             totalRecords = (int)p.Value;
  1512.                     }
  1513.                 }
  1514.                 finally
  1515.                 {
  1516.                     if( holder != null )
  1517.                     {
  1518.                         holder.Close();
  1519.                         holder = null;
  1520.                     }
  1521.                 }
  1522.             } catch {
  1523.                 throw;
  1524.             }
  1525.         }
  1526.  
  1527.         /////////////////////////////////////////////////////////////////////////////
  1528.         /////////////////////////////////////////////////////////////////////////////
  1529.         private bool CheckPassword( string username, string password, bool updateLastLoginActivityDate, bool failIfNotApproved)
  1530.         {
  1531.             string              salt;
  1532.             int                 passwordFormat;
  1533.             return CheckPassword(username, password, updateLastLoginActivityDate, failIfNotApproved, out salt, out passwordFormat);
  1534.         }
  1535.         private bool CheckPassword( string username, string password, bool updateLastLoginActivityDate, bool failIfNotApproved, out string salt, out int passwordFormat)
  1536.         {
  1537.             SqlConnectionHolder holder = null;
  1538.             string              passwdFromDB;
  1539.             int                 status;
  1540.             int                 failedPasswordAttemptCount;
  1541.             int                 failedPasswordAnswerAttemptCount;
  1542.             bool                isPasswordCorrect;
  1543.             bool                isApproved;
  1544.             DateTime            lastLoginDate, lastActivityDate;
  1545.  
  1546.             GetPasswordWithFormat(username, updateLastLoginActivityDate, out status, out passwdFromDB, out passwordFormat, out salt, out failedPasswordAttemptCount,
  1547.                                   out failedPasswordAnswerAttemptCount, out isApproved, out lastLoginDate, out lastActivityDate);
  1548.             if (status != 0)
  1549.                 return false;
  1550.             if (!isApproved && failIfNotApproved)
  1551.                 return false;
  1552.  
  1553.             string encodedPasswd = EncodePassword( password, passwordFormat, salt );
  1554.  
  1555.             isPasswordCorrect = passwdFromDB.Equals( encodedPasswd );
  1556.  
  1557.             if( isPasswordCorrect && failedPasswordAttemptCount == 0 && failedPasswordAnswerAttemptCount == 0 )
  1558.                 return true;
  1559.  
  1560.             try
  1561.             {
  1562.                 try
  1563.                 {
  1564.                     holder = SqlConnectionHelper.GetConnection(_sqlConnectionString, true);
  1565.                     CheckSchemaVersion( holder.Connection );
  1566.  
  1567.                     SqlCommand cmd = new SqlCommand( "dbo.aspnet_Membership_UpdateUserInfo", holder.Connection );
  1568.                     DateTime   dtNow = DateTime.UtcNow;
  1569.                     cmd.CommandTimeout = CommandTimeout;
  1570.                     cmd.CommandType = CommandType.StoredProcedure;
  1571.                     cmd.Parameters.Add( CreateInputParam( "@ApplicationName", SqlDbType.NVarChar, ApplicationName ) );
  1572.                     cmd.Parameters.Add( CreateInputParam( "@UserName", SqlDbType.NVarChar, username ) );
  1573.                     cmd.Parameters.Add( CreateInputParam( "@IsPasswordCorrect", SqlDbType.Bit, isPasswordCorrect ) );
  1574.                     cmd.Parameters.Add( CreateInputParam( "@UpdateLastLoginActivityDate", SqlDbType.Bit, updateLastLoginActivityDate ) );
  1575.                     cmd.Parameters.Add( CreateInputParam( "@MaxInvalidPasswordAttempts", SqlDbType.Int, MaxInvalidPasswordAttempts ) );
  1576.                     cmd.Parameters.Add( CreateInputParam( "@PasswordAttemptWindow", SqlDbType.Int, PasswordAttemptWindow ) );
  1577.                     cmd.Parameters.Add( CreateInputParam( "@CurrentTimeUtc", SqlDbType.DateTime, dtNow));
  1578.                     cmd.Parameters.Add( CreateInputParam( "@LastLoginDate", SqlDbType.DateTime, isPasswordCorrect ? dtNow : lastLoginDate));
  1579.                     cmd.Parameters.Add( CreateInputParam( "@LastActivityDate", SqlDbType.DateTime, isPasswordCorrect ? dtNow : lastActivityDate));
  1580.                     SqlParameter p = new SqlParameter("@ReturnValue", SqlDbType.Int);
  1581.                     p.Direction = ParameterDirection.ReturnValue;
  1582.                     cmd.Parameters.Add(p);
  1583.  
  1584.                     cmd.ExecuteNonQuery();
  1585.  
  1586.                     status = ( ( p.Value != null ) ? ( ( int )p.Value ) : -1 );
  1587.                 }
  1588.                 finally
  1589.                 {
  1590.                     if( holder != null )
  1591.                     {
  1592.                         holder.Close();
  1593.                         holder = null;
  1594.                     }
  1595.                 }
  1596.             }
  1597.             catch
  1598.             {
  1599.                 throw;
  1600.             }
  1601.  
  1602.             return isPasswordCorrect;
  1603.         }
  1604.  
  1605.         /////////////////////////////////////////////////////////////////////////////
  1606.         /////////////////////////////////////////////////////////////////////////////
  1607.         private void GetPasswordWithFormat( string       username,
  1608.                                             bool         updateLastLoginActivityDate,
  1609.                                             out int      status,
  1610.                                             out string   password,
  1611.                                             out int      passwordFormat,
  1612.                                             out string   passwordSalt,
  1613.                                             out int      failedPasswordAttemptCount,
  1614.                                             out int      failedPasswordAnswerAttemptCount,
  1615.                                             out bool     isApproved,
  1616.                                             out DateTime lastLoginDate,
  1617.                                             out DateTime lastActivityDate)
  1618.         {
  1619.             try {
  1620.                 SqlConnectionHolder holder = null;
  1621.                 SqlDataReader       reader = null;
  1622.                 SqlParameter        p      = null;
  1623.  
  1624.                 try {
  1625.                     holder = SqlConnectionHelper.GetConnection( _sqlConnectionString, true );
  1626.                     CheckSchemaVersion( holder.Connection );
  1627.  
  1628.                     SqlCommand    cmd     = new SqlCommand( "dbo.aspnet_Membership_GetPasswordWithFormat", holder.Connection );
  1629.  
  1630.                     cmd.CommandTimeout = CommandTimeout;
  1631.                     cmd.CommandType = CommandType.StoredProcedure;
  1632.                     cmd.Parameters.Add(CreateInputParam( "@ApplicationName", SqlDbType.NVarChar, ApplicationName ) );
  1633.                     cmd.Parameters.Add(CreateInputParam( "@UserName", SqlDbType.NVarChar, username ) );
  1634.                     cmd.Parameters.Add(CreateInputParam("@UpdateLastLoginActivityDate", SqlDbType.Bit, updateLastLoginActivityDate));
  1635.                     cmd.Parameters.Add(CreateInputParam("@CurrentTimeUtc", SqlDbType.DateTime, DateTime.UtcNow));
  1636.  
  1637.                     p = new SqlParameter( "@ReturnValue", SqlDbType.Int );
  1638.                     p.Direction = ParameterDirection.ReturnValue;
  1639.                     cmd.Parameters.Add(p);
  1640.  
  1641.                     reader = cmd.ExecuteReader( CommandBehavior.SingleRow );
  1642.  
  1643.                     status = -1;
  1644.  
  1645.                     if (reader.Read())
  1646.                     {
  1647.                         password = reader.GetString( 0 );
  1648.                         passwordFormat = reader.GetInt32( 1 );
  1649.                         passwordSalt = reader.GetString( 2 );
  1650.                         failedPasswordAttemptCount = reader.GetInt32( 3 );
  1651.                         failedPasswordAnswerAttemptCount = reader.GetInt32( 4 );
  1652.                         isApproved = reader.GetBoolean(5);
  1653.                         lastLoginDate = reader.GetDateTime(6);
  1654.                         lastActivityDate = reader.GetDateTime(7);
  1655.                     }
  1656.                     else
  1657.                     {
  1658.                         password = null;
  1659.                         passwordFormat = 0;
  1660.                         passwordSalt = null;
  1661.                         failedPasswordAttemptCount = 0;
  1662.                         failedPasswordAnswerAttemptCount = 0;
  1663.                         isApproved = false;
  1664.                         lastLoginDate = DateTime.UtcNow;
  1665.                         lastActivityDate = DateTime.UtcNow;
  1666.                     }
  1667.                 }
  1668.                 finally
  1669.                 {
  1670.                     if( reader != null )
  1671.                     {
  1672.                         reader.Close();
  1673.                         reader = null;
  1674.  
  1675.                         status = ( ( p.Value != null ) ? ( ( int )p.Value ) : -1 );
  1676.                     }
  1677.  
  1678.                     if( holder != null )
  1679.                     {
  1680.                         holder.Close();
  1681.                         holder = null;
  1682.                     }
  1683.                 }
  1684.             } catch
  1685.             {
  1686.                 throw;
  1687.             }
  1688.  
  1689.         }
  1690.  
  1691.         /////////////////////////////////////////////////////////////////////////////
  1692.         /////////////////////////////////////////////////////////////////////////////
  1693.         private string GetPasswordFromDB( string       username,
  1694.                                           string       passwordAnswer,
  1695.                                           bool         requiresQuestionAndAnswer,
  1696.                                           out int      passwordFormat,
  1697.                                           out int      status )
  1698.         {
  1699.             try {
  1700.                 SqlConnectionHolder holder = null;
  1701.                 SqlDataReader       reader = null;
  1702.                 SqlParameter        p       = null;
  1703.  
  1704.                 try {
  1705.                     holder = SqlConnectionHelper.GetConnection( _sqlConnectionString, true );
  1706.                     CheckSchemaVersion( holder.Connection );
  1707.  
  1708.                     SqlCommand cmd = new SqlCommand( "dbo.aspnet_Membership_GetPassword", holder.Connection );
  1709.  
  1710.                     cmd.CommandTimeout = CommandTimeout;
  1711.                     cmd.CommandType = CommandType.StoredProcedure;
  1712.                     cmd.Parameters.Add( CreateInputParam( "@ApplicationName", SqlDbType.NVarChar, ApplicationName ) );
  1713.                     cmd.Parameters.Add( CreateInputParam( "@UserName", SqlDbType.NVarChar, username ) );
  1714.                     cmd.Parameters.Add( CreateInputParam( "@MaxInvalidPasswordAttempts", SqlDbType.Int, MaxInvalidPasswordAttempts ) );
  1715.                     cmd.Parameters.Add( CreateInputParam( "@PasswordAttemptWindow", SqlDbType.Int, PasswordAttemptWindow ) );
  1716.                     cmd.Parameters.Add(CreateInputParam("@CurrentTimeUtc", SqlDbType.DateTime, DateTime.UtcNow));
  1717.  
  1718.                     if ( requiresQuestionAndAnswer )
  1719.                     {
  1720.                         cmd.Parameters.Add( CreateInputParam( "@PasswordAnswer", SqlDbType.NVarChar, passwordAnswer ) );
  1721.                     }
  1722.  
  1723.                     p = new SqlParameter( "@ReturnValue", SqlDbType.Int );
  1724.                     p.Direction = ParameterDirection.ReturnValue;
  1725.                     cmd.Parameters.Add(p);
  1726.  
  1727.                     reader = cmd.ExecuteReader( CommandBehavior.SingleRow );
  1728.  
  1729.                     string password = null;
  1730.  
  1731.                     status = -1;
  1732.  
  1733.                     if ( reader.Read() )
  1734.                     {
  1735.                         password = reader.GetString( 0 );
  1736.                         passwordFormat = reader.GetInt32( 1 );
  1737.                     }
  1738.                     else
  1739.                     {
  1740.                         password = null;
  1741.                         passwordFormat = 0;
  1742.                     }
  1743.  
  1744.                     return password;
  1745.                 }
  1746.                 finally
  1747.                 {
  1748.                     if( reader != null )
  1749.                     {
  1750.                         reader.Close();
  1751.                         reader = null;
  1752.  
  1753.                         status = ( ( p.Value != null ) ? ( ( int )p.Value ) : -1 );
  1754.                     }
  1755.  
  1756.                     if( holder != null )
  1757.                     {
  1758.                         holder.Close();
  1759.                         holder = null;
  1760.                     }
  1761.                 }
  1762.             }
  1763.             catch
  1764.             {
  1765.                 throw;
  1766.             }
  1767.  
  1768.         }
  1769.  
  1770.         /////////////////////////////////////////////////////////////////////////////
  1771.         /////////////////////////////////////////////////////////////////////////////
  1772.         private string GetEncodedPasswordAnswer(string username, string passwordAnswer)
  1773.         {
  1774.             if( passwordAnswer != null )
  1775.             {
  1776.                 passwordAnswer = passwordAnswer.Trim();
  1777.             }
  1778.             if (string.IsNullOrEmpty(passwordAnswer))
  1779.                 return passwordAnswer;
  1780.             int status, passwordFormat, failedPasswordAttemptCount, failedPasswordAnswerAttemptCount;
  1781.             string password, passwordSalt;
  1782.             bool isApproved;
  1783.             DateTime lastLoginDate, lastActivityDate;
  1784.             GetPasswordWithFormat(username, false, out status, out password, out passwordFormat, out passwordSalt,
  1785.                                   out failedPasswordAttemptCount, out failedPasswordAnswerAttemptCount, out isApproved, out lastLoginDate, out lastActivityDate);
  1786.             if (status == 0)
  1787.                 return EncodePassword(passwordAnswer.ToLower(CultureInfo.InvariantCulture), passwordFormat, passwordSalt);
  1788.             else
  1789.                 throw new ProviderException(GetExceptionText(status));
  1790.         }
  1791.  
  1792.         /////////////////////////////////////////////////////////////////////////////
  1793.         /////////////////////////////////////////////////////////////////////////////
  1794.  
  1795.         public virtual string GeneratePassword()
  1796.         {
  1797.             return Membership.GeneratePassword(
  1798.                       MinRequiredPasswordLength < PASSWORD_SIZE ? PASSWORD_SIZE : MinRequiredPasswordLength,
  1799.                       MinRequiredNonAlphanumericCharacters );
  1800.         }
  1801.  
  1802.         /////////////////////////////////////////////////////////////////////////////
  1803.         /////////////////////////////////////////////////////////////////////////////
  1804.         private SqlParameter CreateInputParam( string paramName,
  1805.                                                SqlDbType dbType,
  1806.                                                object objValue )
  1807.         {
  1808.  
  1809.             SqlParameter param = new SqlParameter( paramName, dbType );
  1810.  
  1811.             if( objValue == null )
  1812.             {
  1813.                 param.IsNullable = true;
  1814.                 param.Value = DBNull.Value;
  1815.             }
  1816.             else
  1817.             {
  1818.                 param.Value = objValue;
  1819.             }
  1820.  
  1821.             return param;
  1822.         }
  1823.  
  1824.         /////////////////////////////////////////////////////////////////////////////
  1825.         /////////////////////////////////////////////////////////////////////////////
  1826.         private string GetNullableString(SqlDataReader reader, int col)
  1827.         {
  1828.             if( reader.IsDBNull( col ) == false )
  1829.             {
  1830.                 return reader.GetString( col );
  1831.             }
  1832.  
  1833.             return null;
  1834.         }
  1835.         /////////////////////////////////////////////////////////////////////////////
  1836.         /////////////////////////////////////////////////////////////////////////////
  1837.         private string GetExceptionText(int status) {
  1838.             string key;
  1839.             switch (status)
  1840.             {
  1841.             case 0:
  1842.                 return String.Empty;
  1843.             case 1:
  1844.                 key = SR.Membership_UserNotFound;
  1845.                 break;
  1846.             case 2:
  1847.                 key = SR.Membership_WrongPassword;
  1848.                 break;
  1849.             case 3:
  1850.                 key = SR.Membership_WrongAnswer;
  1851.                 break;
  1852.             case 4:
  1853.                 key = SR.Membership_InvalidPassword;
  1854.                 break;
  1855.             case 5:
  1856.                 key = SR.Membership_InvalidQuestion;
  1857.                 break;
  1858.             case 6:
  1859.                 key = SR.Membership_InvalidAnswer;
  1860.                 break;
  1861.             case 7:
  1862.                 key = SR.Membership_InvalidEmail;
  1863.                 break;
  1864.             case 99:
  1865.                 key = SR.Membership_AccountLockOut;
  1866.                 break;
  1867.             default:
  1868.                 key = SR.Provider_Error;
  1869.                 break;
  1870.             }
  1871.             return SR.GetString(key);
  1872.         }
  1873.  
  1874.         private bool IsStatusDueToBadPassword( int status )
  1875.         {
  1876.             return ( status >= 2 && status <= 6 || status == 99 );
  1877.         }
  1878.  
  1879.         private DateTime RoundToSeconds(DateTime dt)
  1880.         {
  1881.             return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second);
  1882.         }
  1883.         internal string GenerateSalt()
  1884.         {
  1885.             byte[] buf = new byte[16];
  1886.             (new RNGCryptoServiceProvider()).GetBytes(buf);
  1887.             return Convert.ToBase64String(buf);
  1888.         }
  1889.         internal string EncodePassword(string pass, int passwordFormat, string salt)
  1890.         {
  1891.             if (passwordFormat == 0) // MembershipPasswordFormat.Clear
  1892.                 return pass;
  1893.  
  1894.             byte[] bIn = Encoding.Unicode.GetBytes(pass);
  1895.             byte[] bSalt = Convert.FromBase64String(salt);
  1896.             byte[] bAll = new byte[bSalt.Length + bIn.Length];
  1897.             byte[] bRet = null;
  1898.  
  1899.             Buffer.BlockCopy(bSalt, 0, bAll, 0, bSalt.Length);
  1900.             Buffer.BlockCopy(bIn, 0, bAll, bSalt.Length, bIn.Length);
  1901.             if (passwordFormat == 1)
  1902.             { // MembershipPasswordFormat.Hashed
  1903.                 HashAlgorithm s = HashAlgorithm.Create( Membership.HashAlgorithmType );
  1904.                 bRet = s.ComputeHash(bAll);
  1905.             } else
  1906.             {
  1907.                 bRet = EncryptPassword( bAll );
  1908.             }
  1909.  
  1910.             return Convert.ToBase64String(bRet);
  1911.         }
  1912.  
  1913.         internal string UnEncodePassword(string pass, int passwordFormat)
  1914.         {
  1915.             switch (passwordFormat)
  1916.             {
  1917.                 case 0: // MembershipPasswordFormat.Clear:
  1918.                     return pass;
  1919.                 case 1: // MembershipPasswordFormat.Hashed:
  1920.                     throw new ProviderException(SR.GetString(SR.Provider_can_not_decode_hashed_password));
  1921.                 default:
  1922.                     byte[] bIn = Convert.FromBase64String(pass);
  1923.                     byte[] bRet = DecryptPassword( bIn );
  1924.                     if (bRet == null)
  1925.                         return null;
  1926.                     return Encoding.Unicode.GetString(bRet, 16, bRet.Length - 16);
  1927.             }
  1928.         }
  1929.     }
  1930.     /////////////////////////////////////////////////////////////////////////////
  1931.     /////////////////////////////////////////////////////////////////////////////
  1932.     /////////////////////////////////////////////////////////////////////////////
  1933.     /////////////////////////////////////////////////////////////////////////////
  1934. }
Add Comment
Please, Sign In to add comment