activerecordmembershipprovider.cs

来自「如果不使用IIS,请先运行 XSP.exe,待提示已侦听 8080端口后」· CS 代码 · 共 1,728 行 · 第 1/4 页

CS
1,728
字号
using System.Web.Security;
using System.Configuration.Provider;
using System.Collections.Specialized;
using System;
using System.Data;
using System.Data.Odbc;
using System.Configuration;
using System.Diagnostics;
using System.Web;
using System.Globalization;
using System.Security.Cryptography;
using System.Text;
using System.Web.Configuration;
using Castle.ActiveRecord;
using Castle.ActiveRecord.Framework;
using NHibernate.Expression;
using Castle.ActiveRecord.Queries;

/// <summary>
///使用ActiveRecord实现的成员管理提供程序
/// </summary>
public class ActiveRecordMemberShipProvider : MembershipProvider
{
    private int newPasswordLength = 6;
    private string eventSource = "DNNLiteMembershipProvider";
    private string eventLog = "Application";
    private string exceptionMessage = "发生了一个错误,请检查错误日志.";

    private static aspnet_Applications app = null;

    //
    // Used when determining encryption key values.
    //

    public ActiveRecordMemberShipProvider()
    {
        DNNLite.GlobalApplication.initActiveRecord();
    }

    private string  machineKey;

    //
    // If false, exceptions are thrown to the caller. If true,
    // exceptions are written to the event log.
    //

    private bool pWriteExceptionsToEventLog;

    public bool WriteExceptionsToEventLog
    {
        get { return pWriteExceptionsToEventLog; }
        set { pWriteExceptionsToEventLog = value; }
    }


    //
    // System.Configuration.Provider.ProviderBase.Initialize Method
    //

    public override void Initialize(string name, NameValueCollection config)
    {
        //
        // Initialize values from web.config.
        //

        if (config == null)
            throw new ArgumentNullException("config");

        if (name == null || name.Length == 0)
            name = "OdbcMembershipProvider";

        if (String.IsNullOrEmpty(config["description"]))
        {
            config.Remove("description");
            config.Add("description", "ActiveRecord Membership provider");
        }

        // Initialize the abstract base class.
        base.Initialize(name, config);

        pApplicationName = GetConfigValue(config["applicationName"],
                                        System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath);
        pMaxInvalidPasswordAttempts = Convert.ToInt32(GetConfigValue(config["maxInvalidPasswordAttempts"], "5"));
        pPasswordAttemptWindow = Convert.ToInt32(GetConfigValue(config["passwordAttemptWindow"], "10"));
        pMinRequiredNonAlphanumericCharacters = Convert.ToInt32(GetConfigValue(config["minRequiredNonAlphanumericCharacters"], "1"));
        pMinRequiredPasswordLength = Convert.ToInt32(GetConfigValue(config["minRequiredPasswordLength"], "7"));
        pPasswordStrengthRegularExpression = Convert.ToString(GetConfigValue(config["passwordStrengthRegularExpression"], ""));
        pEnablePasswordReset = Convert.ToBoolean(GetConfigValue(config["enablePasswordReset"], "true"));
        pEnablePasswordRetrieval = Convert.ToBoolean(GetConfigValue(config["enablePasswordRetrieval"], "true"));
        pRequiresQuestionAndAnswer = Convert.ToBoolean(GetConfigValue(config["requiresQuestionAndAnswer"], "false"));
        pRequiresUniqueEmail = Convert.ToBoolean(GetConfigValue(config["requiresUniqueEmail"], "true"));
        pWriteExceptionsToEventLog = Convert.ToBoolean(GetConfigValue(config["writeExceptionsToEventLog"], "true"));

        string temp_format = config["passwordFormat"];
        if (temp_format == null)
        {
            temp_format = "Hashed";
        }

        switch (temp_format)
        {
            case "Hashed":
                pPasswordFormat = MembershipPasswordFormat.Hashed;
                break;
            case "Encrypted":
                pPasswordFormat = MembershipPasswordFormat.Encrypted;
                break;
            case "Clear":
                pPasswordFormat = MembershipPasswordFormat.Clear;
                break;
            default:
                throw new ProviderException("Password format not supported.");
        }

        // Get encryption and decryption key information from the configuration.

        machineKey = ConfigurationManager.AppSettings["machinekey"];

        app = ActiveRecordMediator<aspnet_Applications>.FindFirst(
             new EqExpression("ApplicationName", pApplicationName)
            );
        if (app == null)
        {
            app = new aspnet_Applications();
            app.ApplicationName = pApplicationName;
            app.Description = Description;
            app.LoweredApplicationName = pApplicationName;
            ActiveRecordMediator<aspnet_Applications>.CreateAndFlush(app);
        }
    }


    //
    // A helper function to retrieve config values from the configuration file.
    //

    private string GetConfigValue(string configValue, string defaultValue)
    {
        if (String.IsNullOrEmpty(configValue))
            return defaultValue;

        return configValue;
    }


    //
    // System.Web.Security.MembershipProvider properties.
    //


    private string pApplicationName;
    private bool pEnablePasswordReset;
    private bool pEnablePasswordRetrieval;
    private bool pRequiresQuestionAndAnswer;
    private bool pRequiresUniqueEmail;
    private int pMaxInvalidPasswordAttempts;
    private int pPasswordAttemptWindow;
    private MembershipPasswordFormat pPasswordFormat;

    public override string ApplicationName
    {
        get { return pApplicationName; }
        set { pApplicationName = value; }
    }

    public override bool EnablePasswordReset
    {
        get { return pEnablePasswordReset; }
    }


    public override bool EnablePasswordRetrieval
    {
        get { return pEnablePasswordRetrieval; }
    }


    public override bool RequiresQuestionAndAnswer
    {
        get { return pRequiresQuestionAndAnswer; }
    }


    public override bool RequiresUniqueEmail
    {
        get { return pRequiresUniqueEmail; }
    }


    public override int MaxInvalidPasswordAttempts
    {
        get { return pMaxInvalidPasswordAttempts; }
    }


    public override int PasswordAttemptWindow
    {
        get { return pPasswordAttemptWindow; }
    }


    public override MembershipPasswordFormat PasswordFormat
    {
        get { return pPasswordFormat; }
    }

    private int pMinRequiredNonAlphanumericCharacters;

    public override int MinRequiredNonAlphanumericCharacters
    {
        get { return pMinRequiredNonAlphanumericCharacters; }
    }

    private int pMinRequiredPasswordLength;

    public override int MinRequiredPasswordLength
    {
        get { return pMinRequiredPasswordLength; }
    }

    private string pPasswordStrengthRegularExpression;

    public override string PasswordStrengthRegularExpression
    {
        get { return pPasswordStrengthRegularExpression; }
    }

    //
    // System.Web.Security.MembershipProvider methods.
    //

    //
    // MembershipProvider.ChangePassword
    //

    #region 私有方法

    private aspnet_Membership GetAspNetMemberShip(string username)
    {
        aspnet_Membership membership = ActiveRecordMediator<aspnet_Membership>.FindFirst(
               new EqExpression("UserName", username),
               new EqExpression("Application", app)
              );
        
        return membership;
    }

    private aspnet_Membership GetAspNetMemberShip(aspnet_Users user)
    {
        aspnet_Membership membership = ActiveRecordMediator<aspnet_Membership>.FindByPrimaryKey(
            user.UserId
            );
        return membership;
    }

    private aspnet_Users GetAspNetUser(string username)
    {
        aspnet_Users user = ActiveRecordMediator<aspnet_Users>.FindFirst(
               new EqExpression("UserName", username),
               new EqExpression("Application", app)
              );
        return user;
    }

    private MembershipUser GetUserFromAspMemberShip(aspnet_Membership membership)
    {

        MembershipUser u = new MembershipUser(this.Name,
                                              membership.UserName ,
                                               membership.UserId ,
                                              membership.Email ,
                                              membership.PasswordQuestion ,
                                              membership.Comment ,
                                              membership.IsApproved ,
                                              membership.IsLockedOut ,
                                              membership.CreateDate ,
                                              membership.LastLoginDate ,
                                              membership.LastActivityDate ,
                                              membership.LastPasswordChangedDate ,
                                              membership.LastLockoutDate );

        return u;
    }

    #endregion


    public override bool ChangePassword(string username, string oldPwd, string newPwd)
    {
        if (!ValidateUser(username, oldPwd))
            return false;

        if (newPwd.Length < MinRequiredPasswordLength)
        {
            throw new MembershipPasswordException();
        }

        ValidatePasswordEventArgs args =
          new ValidatePasswordEventArgs(username, newPwd, true);

        OnValidatingPassword(args);

        if (args.Cancel)
        {
            if (args.FailureInformation != null)
            {
                throw args.FailureInformation;
            }
            else
            {
                throw new MembershipPasswordException("取消修改密码 引发了一个新的密码检查异常.");
            }
        }
        
        aspnet_Membership membership = GetAspNetMemberShip(username);
        if (membership == null)
            return false;

        membership.Password = EncodePassword(newPwd);
        membership.LastPasswordChangedDate = DateTime.Now;

        ActiveRecordMediator<aspnet_Membership>.UpdateAndFlush(membership);
        return true;
        

    }



    //
    // MembershipProvider.ChangePasswordQuestionAndAnswer
    //

    public override bool ChangePasswordQuestionAndAnswer(string username,
                  string password,
                  string newPwdQuestion,
                  string newPwdAnswer)
    {
        if (!ValidateUser(username, password))
            return false;

        aspnet_Membership membership = GetAspNetMemberShip(username);
        if (membership == null)
            return false;

        membership.PasswordQuestion = newPwdQuestion;
        membership.PasswordAnswer = EncodePassword(newPwdAnswer);
        ActiveRecordMediator<aspnet_Membership>.UpdateAndFlush(membership);
        return true;

    }



    //
    // MembershipProvider.CreateUser
    //

    public override MembershipUser CreateUser(string username,
             string password,
             string email,
             string passwordQuestion,
             string passwordAnswer,
             bool isApproved,
             object providerUserKey,
             out MembershipCreateStatus status)
    {
        ValidatePasswordEventArgs args =
          new ValidatePasswordEventArgs(username, password, true);

        OnValidatingPassword(args);

        if (args.Cancel)
        {
            status = MembershipCreateStatus.InvalidPassword;
            return null;
        }

        if (password.Length < MinRequiredPasswordLength)
        {
            status = MembershipCreateStatus.InvalidPassword;
            return null;
        }

        if (RequiresUniqueEmail && GetUserNameByEmail(email) != "")
        {
            status = MembershipCreateStatus.DuplicateEmail;
            return null;
        }

        MembershipUser u = GetUser(username, false);

        if (u == null)
        {
            DateTime createDate = DateTime.Now;

            if (providerUserKey == null)
            {
                providerUserKey = Guid.NewGuid();
            }
            else
            {
                if (!(providerUserKey is Guid))
                {
                    status = MembershipCreateStatus.InvalidProviderUserKey;
                    return null;
                }
            }

            aspnet_Membership membership = new aspnet_Membership();
            aspnet_Users user = new aspnet_Users();

            membership.UserId = (Guid)providerUserKey;
            user.UserId = (Guid)providerUserKey;
            membership.Password = EncodePassword(password);
            membership.Email = email;
            membership.PasswordQuestion = passwordQuestion;
            membership.PasswordAnswer = EncodePassword( passwordAnswer);
            membership.IsApproved = isApproved;
            membership.Comment = "";
            membership.CreateDate = createDate;
            membership.LastPasswordChangedDate = createDate;
            user.LastActivityDate = createDate;
            membership.Application = app;
            user.Application = app;
            membership.IsLockedOut = false;
            membership.LastLockoutDate = createDate;
            membership.FailedPasswordAnswerAttemptCount = 0;
            membership.FailedPasswordAnswerAttemptWindowStart = createDate;
            membership.FailedPasswordAttemptCount = 0;
            membership.FailedPasswordAttemptWindowStart = createDate;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?