Что такое хороший способ расширить членство .Net для отслеживания пользовательских входов - PullRequest
1 голос
/ 11 февраля 2011

Насколько я могу судить, базовая реализация записей членства .Net lastuserlogin, но не отслеживает каждый вход в систему, что мне нужно сделать сейчас. Я провел некоторое исследование и уверен, что один из подходов - создать собственный класс, который расширяет текущий поставщик этой функциональностью, и добавить в схему таблицу событий для записи каждого входа в систему.

Я видел несколько статей на эту тему - возможно, наиболее близкой к этому является статья Скотта Митчелла http://dotnetslackers.com/articles/aspnet/Tracking-User-Activity.aspx, но она написана в ноябре 2008 года, и мне любопытно, может кто-нибудь подсказать мне лучшее решение для этого или подтвердите, что это все еще лучший способ справиться с этим. Я предполагаю, что это довольно распространенное требование. Я все еще использую .Net (использую c #), поэтому любая информация будет очень полезна.

EDIT

Прогресс, но еще не полностью. Я добавил следующий код для создания новой записи в таблице активности входа в систему:

        if (Request.IsAuthenticated)
        {
            MembershipUser currentUser = Membership.GetUser(false);
            string App1 = Membership.Provider.ApplicationName;
            string username = currentUser.UserName;
            object guid1 = currentUser.ProviderUserKey;
            aspnet_CustomActivity login = new aspnet_CustomActivity
            {
                UserId = (Guid) guid1,
                ActivityID = 1, //login
                DateTime = dt1,
                ApplicationName = App1                   
            };
            db.aspnet_CustomActivities.InsertOnSubmit(login);
            db.SubmitChanges();
        }

Итак, у меня есть небольшая проблема, когда я заметил, что ApplicationName пустое, и когда я попытался изменить его в web.config, это вызвало ошибку при получении currentUser.username, но я думаю, что смогу это решить.

Что мне нужно сделать сейчас, чтобы закончить, это привязать это к странице входа в систему, и я думаю, что смогу сделать это, основываясь на подсказках ниже. Я напишу снова, когда закончите, чтобы завершить ответ.

Ответы [ 2 ]

2 голосов
/ 11 февраля 2011

Мы просто создали класс, который расширяет SqlMembershipProvider, переопределяя метод ValidateUser для выполнения любой дополнительной логики, которую мы хотим.(Вам просто нужно изменить раздел <membership> вашего файла web.config, чтобы использовать этого нового провайдера членства.),Вы создаете таблицу в своей схеме, которая ссылается на идентификатор пользователя на основе Guid в стандартных таблицах членства.Вы создаете класс для управления взаимодействием с этой таблицей.Вы создаете свой членский провайдер:

public class MyMembershipProvider : SqlMembershipProvider
{
    public override bool ValidateUser(string username, string password)
    {
        bool validated = base.ValidateUser(username, password);
        if (validated) 
        {
            MembershipUser user = GetUser(username, false); // built in to SqlMembershipProvider
            new LoginTracker().RegisterLogin((Guid)user.ProviderUserKey);
        }
        return validated;
    }
}

Затем вы регистрируете этого провайдера в web.config:

<membership defaultProvider="MyMembershipProvider" userIsOnlineTimeWindow="60">
  <providers>
    <clear/>
    <add name="MyMembershipProvider" ... type="MyAssembly.MyNamespace.MyMembershipProvider, MyAssembly"/>        
  </providers>
</membership>

Простой!

0 голосов
/ 11 февраля 2011

Вам нужно будет реализовать собственный провайдер memberhsip. Взгляните на это: http://msdn.microsoft.com/en-us/library/f1kyba5e.aspx

...