6

Umbraco のユーザーを Umbraco 外の既存のデータベースに対して認証するカスタム メンバーシップ プロバイダーを作成しようとしています。これまでに学んだことから 、 ValidateUser() 関数umbraco.providers.members.UmbracoMembershipProviderを継承してオーバーライドするクラスを作成するよりも、それほど多くの作業は必要ありません。

私が疑問に思っているのは、web.config ファイルで指定する以外に、このクラスを Umbraco プロジェクトに含めたい場合、どのようにすればよいのでしょうか? ソースコードを再コンパイルすることなく、この方法で Umbraco を拡張することは可能ですか?

編集 - http://marcus-abrahamsson.se/post/Membership-Provider-in-Umbracoでこれをどのように実装したかについての記事を書きました

4

1 に答える 1

4

独自のモジュールを作成してビルドし、.dll を Umbraco インストールの bin フォルダーにコピーできます。Umbraco 自体を再コンパイルする必要はありません。

私は非常に似た問題を抱えていましたが、おそらくより小さな要件でした。Umbraco TV のビデオで説明されているように、メンバーの最終ログイン日を表示するために、「最終ログイン」機能を実装しようとしていました。コードベースが変更されたため、説明されている方法は無効になりました。それを機能させるには、2つの一般的な方法があることがわかりました。

独自のメンバーシップ プロバイダーを作成します。UmbracoMembershipProvider から継承し、プロバイダーを使用するように Web 構成を更新します。1 つのメソッドをオーバーライドしたところ、プロバイダー コードは次のようになりました。

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 は、ユーザーが作成されてメンバーシップ ストアに保存されたときに起動されるものではありません。ユーザーがログインすると実際に起動されます。

于 2012-11-28T22:57:07.220 に答える