什么是扩展.Net成员资格以跟踪用户登录的好方法

时间:2011-02-11 20:41:07

标签: .net asp.net-membership membership-provider

据我所知,.Net成员资格的基本实现记录了lastuserlogin,但没有跟踪每次登录,我现在需要做的事情。我做了一些研究,我非常确定一种方法是创建一个自定义类,使用此功能扩展当前提供程序,并向模式添加事件表以记录每次登录。

我已经看到了一些关于此的文章 - 最接近这篇文章来自Scott Mitchell http://dotnetslackers.com/articles/aspnet/Tracking-User-Activity.aspx,但它是从2008年11月开始的,我很好奇是否有人可以指出我更好的解决方案或确认这仍然是解决这个问题的“最佳”方式。我认为这是一个相当普遍的要求。我仍在使用.Net(使用c#),所以任何和所有信息都将受到高度赞赏。

修改

尚未完成进展但尚未完全。我添加了以下代码以在登录活动表中创建新记录:

        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 个答案:

答案 0 :(得分:2)

我们只是创建了一个扩展SqlMembershipProvider的类,重写了ValidateUser方法来执行我们想要的任何额外逻辑。 (您只需要更改web.config文件的<membership>部分即可使用此新的成员资格提供程序。)

修改

真的没什么了不起的。您在架构中创建一个表,该表引用标准成员资格表中基于Guid的用户ID。您创建一个类来管理与此表的交互。您创建了会员提供者:

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>

简单!

答案 1 :(得分:0)

您需要实现自定义成员资格提供程序。看看这个:http://msdn.microsoft.com/en-us/library/f1kyba5e.aspx