Umbraco的会员提供商

时间:2012-11-21 11:40:50

标签: c# umbraco membership-provider

我正在尝试创建一个自定义成员资格提供程序,以便将Umbraco中的用户验证到Umbraco之外的现有数据库。从我到目前为止所学到的,创建一个继承自umbraco.providers.members.UmbracoMembershipProvider的类并覆盖 ValidateUser()函数的类应该不会多得多。

我想知道当我希望将这个类包含在我的Umbraco项目中而不是在web.config文件中指定它时我应该怎么做?是否有可能以这种方式扩展Umbraco,重新编译源代码?

编辑 - 我写了一篇关于我如何在http://marcus-abrahamsson.se/post/Membership-Provider-in-Umbraco

上实现这一点的文章

1 个答案:

答案 0 :(得分:4)

您可以创建和构建自己的模块,然后将.dll复制到Umbraco安装的bin文件夹中。无需重新编译Umbraco本身。

我有一个非常类似的问题,但可能要求较小。我试图实现Umbraco电视视频中描述的“上次登录”功能,以显示成员的最后登录日期。随着代码库的更改,所描述的方法不再有效。我发现有两种方法可以让它发挥作用:

创建您自己的会员提供商。继承自UmbracoMembershipProvider并更新Web配置以使用您的提供程序。我覆盖了一个方法,我的提供者代码看起来像:

using umbraco.BusinessLogic;
using System.Web.Profile;
using System;

namespace zo.Umb.LastLogin
{
    // this approac works, and it may be necessary to extend the membership provider in the future, so that's why I'm
    // leaving it here. But for now I'm using the ApplicationStartupHandler event subscription method
    // in MemberEvent.cs


    /// <summary>
    /// Inherit the default membership provider and substitute my own method that's fired when a member tries
    /// to log in. Note that you must also replace the UmbracoMembershipProvider reference in the web.config 
    /// with a reference to this one. eg:
    /// <add name="UmbracoMembershipProvider" type="zo.Umb.LastLogin.MyMembershipProvider" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" defaultMemberTypeAlias="Another Type" passwordFormat="Hashed" />
    /// 
    /// also note that, to have custom profile properties appear, they must also be added in the web.config
    /// like so:
    /// <profile defaultProvider="UmbracoMemberProfileProvider" enabled="true">
    ///  <providers>
    ///    <clear />
    ///    <add name="UmbracoMemberProfileProvider" type="umbraco.providers.members.UmbracoProfileProvider, umbraco.providers" />
    ///  </providers>
    ///  <properties>
    ///    <clear />
    ///    <add name="lastLogin" allowAnonymous ="false" provider="UmbracoMemberProfileProvider" type="System.DateTime" />
    ///  </properties>
    ///</profile>

    /// </summary>
    public class MyMembershipProvider : umbraco.providers.members.UmbracoMembershipProvider
    {
        public override bool ValidateUser(string username, string password)
        {
            var success = base.ValidateUser(username, password);
            if (success)
            {
                var user = GetUser(username, true);
                var profile = ProfileBase.Create(user.UserName);
                profile["lastLogin"] = DateTime.Now;
                profile.Save();
            }
            return success;
        }
    }
}

当用户尝试获取安全内容时会触发ValidateUser。

请注意,您现在必须更新web.config以指向您的自定义成员资格提供程序。

虽然这很有效,但我不喜欢离开默认提供程序,编辑web.config等,并希望使用之前版本的更“标准”方法。所以我用方法2:

连接到ApplicationStartupHandler,并订阅Member.BeforeSave

using System;
//using umbraco.BusinessLogic;
using umbraco.businesslogic;
using umbraco.cms.businesslogic.member;

namespace zo.Umb.LastLogin
{
    public class MemberEvent : ApplicationStartupHandler
    {
        public MemberEvent()
        {
            Member.BeforeSave += new Member.SaveEventHandler(Member_BeforeSave);
        }

        void Member_BeforeSave(Member sender, umbraco.cms.businesslogic.SaveEventArgs e)
        {
            //Log.Add(LogTypes.Debug, sender.Id, "Member_AfterAddToCache");
            sender.getProperty("lastLogin").Value = DateTime.Now;
        }
   }
}

如果我记得,在创建用户并将其保存到会员店时,member.beforesave是触发的内容;它实际上是在用户登录时触发的。